2015-06-01 37 views
0

unicode的一個http請求後,我已得到使用UTF-8編碼的字節數組,例如: 手柄窗口1252和在Java

byte[] array = new byte[]{0xc3, 0xa4, 0xc2, 0x96} 

我使用 new String(array, "UTF-8")字節數組進行解碼。

在該示例中,第一個解碼字符是0xe4,它代表Unicode中的字母ä - 目前爲止沒有問題。第二個字符0x96代表Windows-1252中的破折號,它代表Unicode中的某個控制字符spa start of guarded area

由於Java正在將字符解釋爲Unicode,所以我得到了一些不可見的字符。

我的問題:我怎樣才能正確地解碼字節數組獲得ä–0xe4 0x2013以Unicode)。

在此先感謝您的幫助:)

+2

有沒有這樣的事,作爲一個「Unicode字符串」或「Latin-1」字符串;一個字符串就是一串字符。 – fge

+7

您明確指定了UTF-8。你期望什麼? – chrylis

+0

爲什麼不使用'new String(array,「Latin-1」)'解碼? – ControlAltDel

回答

2

看來你的服務器混淆了ISO-Latin-1編碼與專有的Windows 1252代碼頁和編碼數據是這樣的結果。 Windows-1252代碼頁與ISO-Latin-1只有幾個地方不同。

您可以將它們轉換回服務器已經使用看過字節修復數據的錯誤假設的Latin-1和其解釋爲CP1252之後,如下:

String string = new String(array, "UTF-8"); 
byte[] fix = string.getBytes(StandardCharsets.ISO_8859_1); 
string = new String(fix, "Windows-1252"); 
+0

非常感謝。 這正是導致問題的原因。感謝您的解決方案,我現在可以補償它。 – Philipp

+0

如果字節被編碼爲UTF-8,那麼它們不被編碼爲ISO8859-1或Windows-1252。反之亦然。使用錯誤的字符集解碼原始字節會產生錯誤的字符,然後重新編碼(現在已損壞的)字符,以便您可以再次解碼它們(進一步損壞)是沒有用的。只需使用正確的字符集來解碼原始字節就可以開始。 –

+0

您應該遵循HTTP規範並查看響應的「Content-Type」頭以知道響應實際使用哪個字符集。如果沒有定義字符集,請使用HTTP協議或特定媒體類型定義的適當默認值。 –