我有一个HTML页面,如下所示:
<HTML>
<meta http-equiv='Content-Type' content='text/html; charset=gb2312'>
<BODY onload='document.forms[0].submit();'>
<form name="form" method="post" action="/path/to/some/servlet">
<input type="hidden" name="username" value="麗安"> <!-- UTF-8 characters -->
</form>
</BODY>
</HTML>
如您所见,此页面的内容为UTF-8,但是我需要使用GB2312字符编码发送它,因为我发送此页面所需要的servlet应该来自我GB2312。
这是有效的方案吗?因为在servlet中,我无法使用将字符编码设置为GB2312的过滤器取回这些汉字!
我创建了一个样本Servlet:
package org.daz;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class EncodingServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private static final String ENCODING = "GB2312";
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
setCharacterEncoding(request, response);
String username = request.getParameter("username");
System.out.println(username);
}
private void setCharacterEncoding(HttpServletRequest request, HttpServletResponse response)throws IOException{
request.setCharacterEncoding(ENCODING);
response.setCharacterEncoding(ENCODING);
}
}
输出为:
楹��
最佳答案
这是不可能的。您需要从一开始就使用GB2312字符,或者将整个应用程序更改为仅使用UTF-8。您不能以这种方式将字符编码X转换为字符编码Y。 ASCII范围以外的任何字符都可能会损坏。
某些建议显示的表单的accept-charset
属性被大多数Web浏览器忽略。 W3 spec还在字面上指出“用户代理可以解释..”,而不是“必须”。即使那样,它也仅用于编码实际的用户输入,而不是示例中的隐藏字段。它们已经以页面自己的编码(在本例中为GB2312)进行了编码。换句话说,在浏览器处理页面时,这些UTF-8字符已经损坏。
关于java - 我可以发送除正文以外的其他形式的POST表单吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2776990/