我目前正在学习JEE,在一个练习中,我只需要使用带有POST方法的基本格式将文本数据从.jsp文件发送到另一个文件。以这种形式,我希望能够使用带重音的字符,因此我在jsp文件的顶部使用了<%@page pageEncoding="UTF-8" %>
,它们同时具有<meta charset="utf-8">
标记,并且我的IDE(Eclipse)已配置为编码UTF-8中的所有内容。
问题是,在行的结尾,当我尝试使用EL显示我的字符时,重音字符(以及我猜想的其他字符)都以ISO-8859-1编码。
在这里真正独特的是,使用GET方法发送数据时,我根本没有任何问题。通过Servlet中设置的属性在请求中传递String时,结果相同。
事实上,我已经通过将请求发送到servlet并在doPost方法中调用request.setCharacterEncoding("utf-8")
来解决了这个问题(确切地说,在此之前调用request.getCharacterEncoding()
会给我null
),但是我想了解这里到底发生了什么。我猜它来自服务器配置错误,但是当我检查服务器配置的web.xml文件时,有以下几行:
<filter>
<filter-name>setCharacterEncodingFilter</filter-name>
<filter-class>org.apache.catalina.filters.SetCharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<async-supported>true</async-supported>
</filter>
我的困惑来自于没有人告诉我使用request.setCharacterEncoding("utf-8")
的事实,而且我认为这样做非正常,所以我想问题是:绝对要用吗?为什么呢不应通过服务器的配置来处理编码吗?
我正在使用Tomcat 9作为服务器,并且在Ubuntu下(不知道它是否有帮助)。
答案 0 :(得分:0)
答案在这里(感谢Selaron):http://balusc.omnifaces.org/2009/05/unicode-how-to-get-characters-right.html
URL解码POST请求参数是一个故事。网络浏览器 即应该发送Content-Type中使用的字符集 请求标头。但是,大多数网络浏览器都不这样做。那些 webbrowsers只会使用与网页相同的字符编码 该表格是随同提供的,即与指定的字符集相同 在HTTP响应或标签的Content-Type标头中。
基本上,问题来自导航器,该导航器应传递其在标头请求中使用的编码字符集,但不这样做。由于没有给Tomcat任何字符集来解码请求,因此默认情况下,它自行决定执行ISO-8859-1样式。显然,您无法进行配置!因此,您只需通过指示编码字符集为UTF-8来强制使用它即可。
我猜写我正在关注的讲座的那个人有一个更好的导航器,因为他从未提到过这个问题。无论如何,现在我感觉好多了!非常感谢!