我有一个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/

10-15 08:01