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

时间:2013-10-18 09:11:25

标签: java http post utf-8 httpurlconnection

我正在尝试使用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();
    ...
 }

我将它发布到localhost只是为了用WireShark嗅它。 问题是当我的正文是包含“ò”字符的字符串时,à''è' 'ç'...我看到的请求有一个字符串正确,这些字符被点替换。

例如: 如果身体是“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!"}

任何帮助将不胜感激。 谢谢

1 个答案:

答案 0 :(得分:4)

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

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