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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我可以使用其身体以外的编码发送POST表单吗?相关的知识,希望对你有一定的参考价值。

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

另一答案

你可以尝试这样做,

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

另一答案
 <form accept-charset="gb2312"

http://www.w3.org/TR/REC-html40/interact/forms.html#adef-accept-charset

以上是关于我可以使用其身体以外的编码发送POST表单吗?的主要内容,如果未能解决你的问题,请参考以下文章

使用 POST 表单发送 Blob 对象

使用 AJAX + 多部分表单数据 + UTF-8 编码发送文件和文本

Stripe Webhooks - 我可以发送 200 以外的响应代码吗?

未收到 WinHttp POST 正文

使用 HTML 表单发送 RAW 数据 POST 请求?

GET和POST 编码和乱码