2010-05-05 28 views
1

我有一个HTML页面,看起来像:我可以发送POST表单而不是其正文的编码吗?

<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); 
    } 

} 

输出为:楹��

回答

1

这是不可能的。您需要从头开始使用GB2312字符,或者将整个应用程序更改为仅使用UTF-8。您无法将字符编码X转换为字符编码Y. ASCII范围之外的任何字符都可能被损坏。

窗体的accept-charset属性,因为一些建议被大多数浏览器忽略。 W3 spec也字面上声明“用户代理可能解释..”,而不是“必须”。即使如此,它只会用于编码实际的用户输入,而不是像你的例子那样隐藏的字段。它们已经被编码在页面自己的编码中(在本例中为GB2312)。换句话说,那些UTF-8字符是已经在页面被浏览器处理的那一刻破坏了。

+0

非常感谢,我在我的博客上评论了这个结论:http://m-hewedy.blogspot.com/2010/05/beware-your-text-editor-encodes-your.html – 2010-05-06 01:50:04

+0

不客气。我的昵称是顺便** BalusC **,而不是* BlueC *;) – BalusC 2010-05-06 01:58:18

+0

哦,你可能会发现[这篇文章](http://balusc.blogspot.com/2009/05/unicode-how-to-get -characters-right.html),以便在字符和字节的世界中获得更多的洞察力。 – BalusC 2010-05-06 02:09:05

1

你可以尝试这样做,

<form name="form" method="post" action="/path/to/some/servlet" charset="gb2312" accept-encoding="gb2312"> 
<input type="hidden" name="username" value="麗安"> <!-- UTF-8 characters --> 
</form> 

它可能在某些浏览器。但是,浏览器不需要支持GB2312,因此你的里程可能会有所不同。

+0

我已经试过两个Firefox和Chrome,而且似乎不是为我工作! – 2010-05-06 00:55:29

+0

它也取决于操作系统。它适用于中文Windows XP上的IE6。 – 2010-05-06 02:41:02

相关问题