2014-11-01 41 views
1

我使用簡單的代碼來檢索JSON對象。 JSON採用Unicode格式,幷包含一些西里爾文字符。Google App Engine的URLConnection不正確地讀取一些西里爾文符號

URL url = new URL("blahblah"); 
URLConnection con = url.openConnection(); 
con.setConnectTimeout(10000); 
BufferedReader reader = new BufferedReader(new inputStreamReader(con 
    .getInputStream())); 
String json = reader.readLine(); 

的代碼在 「標準」 Java實現工作完全正常:

Владивосток

然而,當我使用谷歌的App Engine應用程序相同的片段,一些西裏爾字母變成 ?人物:

ладиво??ок

我注意到,從basic Cyrillic character set,只有中間一半(與代碼0421-043F符號)被正確讀取?我不知道該怎麼做。

此行爲是由Google重新實現java.net類造成的,還是我的疏忽?

回答

1

您必須使用與用於在其他服務器/源上創建和發送數據的編碼相同的編碼。

在構造函數InputStreamReader中指定相同的編碼。

例如,如果你想使用UTF-8編碼:

BufferedReader reader = new BufferedReader(new InputStreamReader(
    con.getInputStream(), StandardCharsets.UTF_8)); 

如果沒有明確指定編碼,從javadoc of the constructor that doesn't take the encoding報價:

創建一個使用一個InputStreamReader默認字符集。

所以會使用平臺相關的默認字符集,所以它可能在不同的操作系統上工作不同。所以總是指定字符集。

編輯:

它建議使用服務器報告的編碼。你可以通過URLConnection.getContentEncoding()得到:

BufferedReader reader = new BufferedReader(new InputStreamReader(
    con.getInputStream(), con.getContentEncoding())); 
+0

我試過顯式地將編碼設置爲StandardCharsets.UTF_8,但是將所有符號轉換爲問號的效果相反。事實證明,JSON是用另一個不明確的編碼創建的,儘管getContentType()返回「charset = utf8」。我已經指定了正確的字符集,現在一切正常。感謝您的幫助! – Doghouse87 2014-11-01 15:12:37

相關問題