Java 从Servlet在JSP页面中显示UTF-8文本
当我试图通过Java 从Servlet在JSP页面中显示UTF-8文本,java,jsp,Java,Jsp,当我试图通过request.setAttribute()在JSP上显示德语文本,例如Zurücksetzen时,结果显示为Zur�cksetzen request.setAttribute("test", "Zurücksetzen"); 我的JSP页面将contentType定义为UTF-8: <%@ page contentType="text/html;charset=UTF-8" %> <!DOCTYPE html> <html lang="en">
request.setAttribute()
在JSP上显示德语文本,例如Zurücksetzen时,结果显示为Zur�cksetzen
request.setAttribute("test", "Zurücksetzen");
我的JSP页面将contentType定义为UTF-8:
<%@ page contentType="text/html;charset=UTF-8" %>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
我用${test}
简单地显示属性
如果我将请求转发到JSP页面而不是包含JSP,则文本显示正确 前进(工作):
request.getRequestDispatcher(“/WEB-INF/views/index.jsp”).forward(请求,响应)代码>
包括(不工作):
request.getRequestDispatcher(“/WEB-INF/views/index.jsp”)。包括(请求、响应)代码>
我的IDE使用UTF-8
设置ServletResponse的编码:
response.setCharacterEncoding("UTF-8");
回答我自己的问题:
如中所述,默认值如下所示
The default MIME type is text/html for traditional JSP pages; it is text/xml for JSP XML documents.
The default for the page source character encoding (for translation) is ISO-8859-1 (also known as Latin-1) for traditional JSP pages; it is UTF-8 or UTF-16 for JSP XML documents.
The default for the response character encoding is ISO-8859-1 for traditional JSP pages; it is UTF-8 or UTF-16 for JSP XML documents.
The determination of UTF-8 versus UTF-16 is according to "Autodetection of Character Encodings" in the XML specification, at the following location
因此,Servlet
和JSP
页面默认为ISO-8859-1
request.getRequestDispatcher(“/WEB-INF/views/index.jsp”)。包括(请求、响应)代码>
当您.include
一个JSP页面时,如上所述,该页面使用默认字符编码(ISO-8859-1)进行编码。为了使用UTF-8编码,必须设置response.setCharacterEncoding(“UTF-8”)代码>注意:JSP中的ContentType指令被忽略
request.getRequestDispatcher(“/WEB-INF/views/index.jsp”).forward(请求,响应)代码>
如上所述,当您.forward
到JSP页面,或直接从浏览器访问JSP页面时,页面将使用默认字符编码(ISO-8859-1)进行编码。为了使用UTF-8编码,您必须添加作为JSP页面的第一行,如Spring所述,最好的方法是使用Spring筛选器CharacterEncodingFilter在web.xml中全局设置对UTF-8的响应:
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
编码滤波器
org.springframework.web.filter.CharacterEncodingFilter
编码
UTF-8
强制编码
真的
编码滤波器
/*
您的文件是否也使用UTF-8编码保存?Zur�cksetzen
是在UTF-8
中显示(或尝试)数据的ISO-8859-1
结果。您的Java文件是UTF-8吗?如何确定我的Java文件是UTF-8?我用IntellijQuery在Macbook上,谁把问题记下来了!?原因。。。这起作用了:)。但你可能会因为你的简短回答(我喜欢)而失分。太高兴了!我试了好几个小时!谢谢,这是一个非常糟糕的“解决”这个问题的方法。您不需要在响应中显式设置字符编码。这将是非常乏味的。@LuiggiMendoza这就是为什么我使用这样定义的设置实现一个抽象Servlet,然后从具体的Servlet实现。各位,a)请冷静(我看到一条攻击性评论,几秒钟后被删除)b)那些能够提出更好解决方案的人可能会对这个问题给出另一个答案,对吗?不需要宣传。这个问题有很多重复的地方。通过这些检查,查看所有需要考虑的部分。字符编码比人们想象的要复杂得多,所以提出这样的解决方案会给人错误的印象。手动设置响应编码不是一个解决方案,它是一个黑客。