gpt4 book ai didi

Java HttpUrlConnection POST 请求特殊字符的奇怪行为

转载 作者:可可西里 更新时间:2023-11-01 16:56:23 25 4
gpt4 key购买 nike

我正在尝试使用 HttpURLConnection 实现 POST 请求。这是我的代码:

private static void call(String body) throws IOException{
HttpURLConnection con = null;

con = (HttpURLConnection)new URL("http://127.0.0.1:8080").openConnection();

con.setRequestProperty("Accept-Charset", "UTF-8");
con.setRequestMethod("POST");
con.setRequestProperty("Content-Type", "application/json; charset=utf-8");
con.setRequestProperty("Accept", "application/json; charset=utf-8");

con.setDoOutput(true);
DataOutputStream wr = new DataOutputStream(con.getOutputStream());
wr.writeBytes(body);
wr.flush();
wr.close();
...
}

我将它发布到本地主机只是为了用 WireShark 嗅探它。问题是,当我的 body 是一个包含像 'ò' 'à' 'è' 这样的字符的字符串时'ç' ...我看到的请求中的字符串是正确的,其中的字符被点替换了。

例子:如果正文是“hèllo!” ---> 请求正文是“h.llo!

只是为了测试,我在 java main 中执行上述方法,并以这种方式传递参数:

String pString = "{\"titlè\":\"Hèllo Wòrld!\"}";
String params = new String(pString.getBytes("UTF-8"),"UTF-8");
....
call(body);

这就是我在 WireShark 中得到的:

POST / HTTP/1.1
Accept-Charset: UTF-8
Content-Type: application/json; charset=utf-8
Accept: application/json; charset=utf-8
User-Agent: Java/1.6.0_43
Host: 127.0.0.1:8080
Connection: keep-alive
Content-Length: 24

{"titl.":"H.llo W.rld!"}

如有任何帮助,我们将不胜感激。谢谢

最佳答案

Java 中的内部字符串表示始终是 UTF-16。因此,在您的第二个示例中,params = new String(pString.getBytes("UTF-8"),"UTF-8"); 将 pString 转换为具有 UTF-8 内容的字节数组,然后返回到UTF-16 存储在参数中。当字符串进入或离开 VM 时,必须完成每个编码。这意味着在您的情况下,您必须在将正文写入流时设置编码。

wr.write(body.getBytes("UTF-8"));

关于Java HttpUrlConnection POST 请求特殊字符的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19445797/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com