我可以使用其身体以外的编码发送POST表单吗?

问题描述 投票:1回答:3

我有一个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);
    }

}

输出是:楹��

java jsp web-applications encoding servlets
3个回答
1
投票

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

一些建议的表单的accept-charset属性被大多数webbrowsers忽略。 W3 spec也字面上说“用户代理可以解释......”,而不是“必须”。即使这样,它也只会用于编码实际的用户输入,而不是像示例中的隐藏字段。它们已经在页面自己的编码中编码(在本例中为GB2312)。换句话说,在浏览器处理页面时,那些UTF-8字符已经损坏。


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,因此您的里程可能会有所不同。


© www.soinside.com 2019 - 2024. All rights reserved.