我正在创建一个简单的登录页面,并希望将登录和密码参数作为UTF-8编码字符串传递。正如您在下面的代码中所看到的,第一行是我将编码设置为UTF-8的地方,但这似乎没有意义,因为它不起作用。当我使用带有重音符号的登录和密码参数时,结果页面会收到奇怪的字符。
如何以适用于所有浏览器的方式正确设置字符编码?
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>My Page</title>
</head>
<body>
<h1>Welcome to My Page</h1>
<form name="login" action="login.jsp" method="POST">
Login:<br/>
<input type="text" name="login" value="" /><br/>
Password:<br/>
<input type="password" name="password" value="" /><br/>
<br/>
<input type="submit" value="Login" /><br/>
</form>
</body>
</html>
问题取决于使用哪个应用服务器。即使页面设置正确,例如UTF8,尝试以正确的形式(根据预期语言)获取参数也不会产生良好的结果,即请求。getParameter(…)返回非预期字符,因为参数的默认代码页大多为8859-1。这意味着,参数的代码页独立于JSP页面的代码页,参数的默认代码页会影响结果。我在这里找到了最好的描述:[1]:http://docs.cksource.com/CKFinder_2.x/Developers_Guide/Java/Configuration/URI_Encoding.在一些应用服务器中,“请求.设置字符编码(…)”没有效果。您必须在描述符中设置参数编码。最复杂的是JBoss,Apache Tomcat,中间是Glassfish。WebLogic更好,Jetty最好(UTF-8是默认设置)。在我的情况下,我必须创建glassfish网络。xml描述符并将参数编码标记放在那里。就我而言(玻璃鱼):
<glassfish-web-app error-url="">
<!-- request.setCharacterEncoding("UTF-8") not functioning -->
<parameter-encoding default-charset="UTF-8" />
</glassfish-web-app>
在某些情况下,调用ServletRequest#set特色编码()仍然会失败。
如果您的容器仔细遵循servlet规范(就像tomcat一样),那么默认情况下,它将post参数解释为ISO-8859-1。这可能会在UTF-8字符(例如我最近处理过的日语)到达代码之前弄乱它们,特别是如果您有一个servlet过滤器,它使用getParameter()或
getParameters()检查请求参数。这两种方法强制对参数进行解码,解码只进行一次。
如果您有查看请求参数的过滤器,这里有一个链接,介绍如何在Tomcat中绕过此问题。人们会想检查文档中的特定容器。
http://wiki.apache.org/tomcat/FAQ/CharacterEncoding#Q1
其中的关键是:
添加
useBodyEncodingForURI="true" URIEncoding="UTF-8"
到Tomcat的server.xml中的Context元素,并添加
<filter>
<filter-name>Character Encoding Filter</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>
</filter>
<filter-mapping>
<filter-name>Character Encoding Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
就像web.xml.中任何调用getParameter()或getParameters()的过滤器一样,我发现尽管上面的链接使上下文元素的两个属性看起来像是替代属性,但useBodyEncodingForURI是绝对必要的,否则tomcat不会设置查询字符串的编码。来自tomcat 7.0.42中的Request.java:
boolean useBodyEncodingForURI = connector.getUseBodyEncodingForURI();
if (enc != null) {
parameters.setEncoding(enc);
if (useBodyEncodingForURI) {
parameters.setQueryStringEncoding(enc);
}
} else {
parameters.setEncoding
(org.apache.coyote.Constants.DEFAULT_CHARACTER_ENCODING);
if (useBodyEncodingForURI) {
parameters.setQueryStringEncoding
(org.apache.coyote.Constants.DEFAULT_CHARACTER_ENCODING);
}
}
pageEncode
仅设置HTTPContent-Type
标头的响应字符编码和charset
属性。基本上,它告诉服务器在将JSP生成的字符发送到客户端之前将其解码为UTF-8,标头告诉客户端使用UTF-8对它们进行编码,并且在将同一页面中的任何表单提交回服务器时也使用它。contentType
已经默认为text/html
,因此以下内容就足够了:
<%@page pageEncoding="UTF-8"%>
当页面通过HTTP提供时,超文本标记语言元标记被忽略。它仅在页面被客户端保存为本地磁盘系统上的超文本标记语言文件,然后由浏览器中的file://
URI打开时使用。
在您的特定情况下,HTTP请求体编码显然没有设置为UTF-8。在请求中涉及的任何servlet或过滤器首次调用request.getXxx()
之前,请求体编码需要由servlet或过滤器中的ServletRequest#set特色编码()
设置。
request.setCharacterEncoding("UTF-8");
String login = request.getParameter("login");
String password = request.getParameter("password");
// ...
问题内容: 我正在创建一个简单的登录页面,我想将登录名和密码参数作为UTF-8编码的字符串传递。正如您在下面的代码中看到的那样,第一行是我将编码设置为UTF-8的位置,但这似乎毫无意义,因为它不起作用。当我在重音符号中使用登录名和密码参数时,结果页面会收到奇怪的字符。 如何以一种适用于所有浏览器的方式正确设置字符编码? 问题答案: 在只设置响应的字符编码和所述HTTP的属性标题中。基本上,它告诉服
问题内容: 我有一个带有“ñ”字符的字符串,并且我有一些问题。我需要将此字符串编码为UTF-8编码。我已经通过这种方式尝试过,但是没有用: 如何将该字符串编码为utf-8? 问题答案: Java中的对象使用无法修改的UTF-16编码。 唯一可以使用不同编码的是。因此,如果你需要UTF-8数据,则需要一个。如果你有一个包含意外数据的,则问题出在较早的地方,该错误地将一些二进制数据错误地转换为a (即
问题内容: 我遇到了这行遗留代码,我试图找出这些遗留代码: 据我了解,它是使用相同的charSet进行编码和解码。 这与以下内容有何不同? 在任何情况下,两条生产线的输出将不同? ps:只是要澄清一下,是的,我知道Joel Spolsky撰写的关于编码 的出色文章! 问题答案: 这可能是很复杂的方式 这缩短了String,而所使用的基础char []则更长。 但是,更具体地说,将检查每个字符是否都
问题内容: 我正在将ajax发布到webmethod上,我可以在客户端(通过Firebug)看到请求的状态为200,但未达到我的webmethod中的停止点(webmethod的第一行)。json参数一切正常,但是通过反序列化json的方式,我不得不将其更改为字符串。 js: aspx: 问题答案: 您在jQuery JSON帖子中缺少内容类型: 请参阅本文。当我遇到类似的问题时,它对我很有帮助:
问题内容: 我正在尝试将示例从Primefaces实施到WAB包中。 当我尝试访问JSF页面时,该页面为空。我在Glassfish日志文件中收到此错误: 我该如何解决这个问题?我想这可能是由POM配置引起的吗? 问题答案: JSF / Facelets默认情况下已经使用UTF-8(在还原视图期间进行设置),但是PrimeFaces ajax视图处理程序会在还原视图之前尝试访问请求参数,因此将使用服
问题内容: 我正在使用BeautifulSoup从HTML提取一些文本,但是我只是想不出如何正确地将其打印到屏幕(或与此相关的文件)上。 这是我的包含文本的类的样子: 当尝试打印一个实例时,这是我在控制台上看到的: 无论我尝试什么,都无法获得想要的输出(上面的文本应该是希伯来语)。我的最终目标是序列化到文件(使用json或pickle)并能够将其读回。 我在Ubuntu 10.10上使用Pytho