java - 为什么发送和接收 POST 请求之间的字符编码不匹配?
问题描述
我有一个 java servlet,它接收带有应该以 UTF-8 编码的数据的 POST 请求,但它似乎是以 ISO-8859-1 编码的。
为了进一步说明,这里是一些代码示例:
在 Java 中,使用 Apache HttpClient 发送 PostRequest 时:
PostMethod postMethod = new PostMethod(url);
postMethod.getParams().setContentCharset("UTF-8");
String bar = "\u200B\u200B\u200B\u200B\u200B\u200B\u200B";
postMethod.addParameter("body", bar);
HttpClient httpClient = new HttpClient();
int status = httpClient.executeMethod(postMethod);
在接收端(在doPost
HttpServlet的方法中):
String body = new String(req.getParameter("body").getBytes(), req.getCharacterEncoding());
在上面的示例中,当我有一个发送请求的调试断点时,bar.getBytes(StandardCharsets.UTF_8) = [-30, -128, -117, -30, -128, -117, -30, -128, -117, -30, -128, -117, -30, -128, -117, -30, -128, -117, -30, -128, -117]
. 但是当我在接收端检查字符串时,即使请求设置为 UTF-8 编码,如果我执行bar.getBytes(StandardCharsets.ISO_8859_1)
.
所以基本上,当我发送字符串时,它作为 UTF-8 被放入参数中,但它被作为 ISO 读出。为了获得正确的处理值,我必须使用String utf8String = new String(bar.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF-8)
为什么会这样?是否有一些我在某处遗漏的配置?需要注意的是,发送者和接收者在不同的tomcat实例中,可能在同一台机器上,但不一定。
解决方案
你已经试过了吗?
postMethod.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=utf-8")
推荐阅读
- .net-core - Blazor Webassembly 核心托管基础 Href 区分大小写
- chatbot - 如何使用登录数据连接到 rasa 服务器(以 rasa-webchat 作为前端)以实现会话持久性?
- react-native - 在 React 导航底部选项卡中使用自定义图标
- javascript - 如何在本机反应中使用两个 Firestore 查询获取数据
- python - 我的 if 和 else 语句都在 Python 中执行
- javascript - 找不到模块:无法解析“@ckeditor/ckeditor5-build-tong”
- assembly - GS,ES,FS,ES,DS,CS,SS中的值是什么?
- swift - 如何在行集合视图中制作 2 个单元格
- python - 在 kivy 中使用 Clock
- perl - 如何在perl中对文件中两个模式之间的所有行进行排序