如何在Java中更改HTTP响应中的字符集编码
我必须从远程服务器获取一些JSON对象,为此我正在使用这个function很好,除了有时一些奇怪的数据被提取,我相信是因为它使用ASCII字符集进行解码。
请在下面找到我正在使用的方法
public HttpResponse call(String serviceURL,String serviceHost,String namespace,String methodName,String payloadKey, String payloadValue) throws ClientProtocolException,IOException,JSONException { HttpResponse response = null; HttpContext HTTP_CONTEXT = new BasicHttpContext(); HTTP_CONTEXT.setAttribute(CoreProtocolPNames.USER_AGENT, "Mozilla/5.0"); HttpPost httppost = new HttpPost(serviceURL); httppost.setHeader("User-Agent",Constants.USER_AGENT_BROWSER_FIREFOX); httppost.setHeader("Accept", "application/json, text/javascript, */*"); httppost.setHeader("Accept-Language","en-US,en;q=0.8"); httppost.setHeader("Content-Encoding", "foo-1.0"); httppost.setHeader("Content-Type", "application/json; charset=UTF-8"); httppost.setHeader("X-Requested-With","XMLHttpRequest"); httppost.setHeader("Host",serviceHost); httppost.setHeader("X-Foo-Target", String.format("%s.%s", namespace,methodName)); /*Making Payload*/ JSONObject objectForPayload = new JSONObject(); objectForPayload.put(payloadKey, payloadValue); StringEntity stringentity = new StringEntity(objectForPayload.toString()); httppost.setEntity(stringentity); response = client.execute(httppost); return response; }
我传递的所有这些标题都是正确的,如果您熟悉Mozilla,我已通过Google Chrome或Firebug插件中的inspect元素validation了相同内容。
现在的问题是,大部分时间我都在获取可读数据但有时我确实得到了不可读的数据。
我使用eclipse调试并注意到wrappedEntity下的charset显示为“US-ASCII”。 我附上一个jpg作为参考
有人可以告诉我如何才能在响应之前将字符集从ASCII更改为UTF-8 response = client.execute(httppost);
。 PS:你已经注意到我在标题中传递charset = utf-8并且我已经使用firebug和谷歌chromevalidation了我传递的确切标题。
请放大以更清楚地查看图像
提前致谢
我能够解决这个问题,只是为可能面临类似问题的人提及它。 获得响应后,首先使用HttpEntity entity = response.getEntity();
并且因为我的响应是一个json对象将实体转换为字符串但使用“UTF-8”之类的东西就像这个responseJsonObject = new JSONObject(EntityUtils.toString(entity,"UTF-8"));
以前我只是在做responseJsonObject = new JSONObject(EntityUtils.toString(entity));
您可能需要添加Accept-encoding标头并将其设置为UTF-8
我不认为这是你的标题的问题,我认为这是你的字符串的问题。 只是让标题说它是utf-8并不意味着你写的字符串是utf-8,这在很大程度上取决于字符串的编码方式以及“payloadValue”中的内容
也就是说,您可以在通过电线发送之前始终正确地对事物进行重新编码,例如:
objectForPayload.put(payloadKey, payloadValue); StringEntity stringentity = new StringEntity( new String( objectForPayload.toString().getBytes(), "UTF8"));
看看它是否适合你。
- Apache http客户端默认设置不适用于sni
- Apache HttpClient 4.1 – 代理validation
- 如何用RequestConfig替换不推荐使用的httpClient.getParams()?
- 如何 – Spring IoC和HttpClient 4.3.1 CloseableHttpClient?
- 如何使Unirest(java)忽略证书错误
- 不推荐使用HttpClient.getParams()。 我该怎么用?
- Apache Camel Http和SSL
- javax.net.ssl.SSLPeerUnverifiedException:主机名与对等方提供的证书主题不匹配
- 什么是apache中的SchemeRegistry以及何时应该使用它?