2012-03-03 61 views
4

我想读一个JSON字符串:URLConnection的字符编码

{ 
    "also_known_as": [ 
    "Сильвестр Сталлоне" 
    ], 

    "birthday": "1946-07-06", 
    "deathday": "", 
} 

通过HTTP。

我有以下代码:

URL url = new URL("url"); 
HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
connection.setRequestProperty("Accept-Charset", "UTF-8");//connection.setRequestProperty("Accept-Charset", "ISO-8859-1"); 
BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); 
String line = ""; 
StringWriter writer = new StringWriter(); 
while((line=reader.readLine())!=null){ 
    writer.write(line); 
} 
reader.close(); 
writer.close();  
connection.disconnect(); 
System.out.println(writer.toString()); 

但它打印字符串中控制台:

{ 
    "also_known_as": [ 
    "СильвеÑ?Ñ‚Ñ€ Сталлоне" 
    ], 

    "birthday": "1946-07-06", 
    "deathday": "", 
} 

我也曾尝试:

BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8"));//BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), "ISO-8859-1")); 

,但没有运气。

我的问题是我怎么可以设置URLConnection的字符编码?

任何信息对我都很有帮助。

问候。


使用Apache IOUtils我已经试过这样:

StringWriter writer = new StringWriter(); 
IOUtils.copy(connection.getInputStream(), writer, "UTF-8"); 

但它打印在Eclipse的控制台相同的结果。


使用Apache的HttpClient:

DefaultHttpClient httpClient = new DefaultHttpClient(); 
HttpGet getRequest = new HttpGet("http://api.themoviedb.org/3/person/16483?api_key=23e89da030a0ee8b25aaed20950a0c25"); 
getRequest.addHeader("accept", "application/json"); 
HttpResponse response = httpClient.execute(getRequest); 
StringWriter writer = new StringWriter(); 
IOUtils.copy(response.getEntity().getContent(), writer, "UTF-8"); 
System.out.println(writer.toString()); 

相同的结果。

+1

你要编码的BufferedReader或StringWriter的适当字符集 – mKorbel 2012-03-03 19:47:01

+0

@mKorbel我曾尝试使用IOUtils。我编辑了我的答案。但它也是一样的结果。 :( – 2012-03-03 20:08:17

+1

你确定这不是你的控制台的字符集设置不正确吗? – 2012-03-03 20:20:58

回答

5

刚飞出我的评论到一个答案,这竟然是原因:控制台的字符集显的Cp1252,所以输出是正确的,但错误显示。

+1

今天欧盟罚款微软500亿欧元不提供其他浏览器。这是不公平的,恕我直言。会是什么:每天罚款5亿欧元*这个该死的绝对无用的非标准CP1252只是标准编码,没有办法改变! – Ingo 2013-03-06 20:28:48

1

作出这样的:

new InputStreamReader(connection.getInputStream(), new Charset("UTF-8")) 

即指定字符集。

+0

这是错误的。你必须检查字符集的HTTP标头。你不能假设UTF-8。 – tchrist 2012-03-03 20:24:16

+0

@tchrist嗯,是的,在这种情况下'connection.getContentType )'和解析 – Manish 2012-03-03 20:35:57

+1

@Manish不幸的是,很多网站不小心正确指定字符集,什么是在这种情况下,标准 – Ingo 2013-03-06 20:30:35