簡體   English   中英

在Java中錯誤地修復了ISO-8859-1解碼的UTF-8字符串

[英]Fixing incorrectly ISO-8859-1 decoded UTF-8 string in Java

我必須處理不在我控制范圍內的圖書館。 它提供一個字符串,並使用ISO-8859-1從字節流對其進行解碼。 但是字節流是UTF-8。 因此,很明顯,如果包含非ASCII字符,我得到的結果字符串是錯誤的。

因此,我要解決的問題是將字符串轉換回字節流,並使用UTF-8再次對其進行解碼。 像這樣:

byte[] raw = inputText.getBytes(StandardCharsets.ISO_8859_1);
String correctedText = new String(raw, StandardCharsets.UTF_8);

我通過許多示例對其進行了測試,並且似乎可以正常工作。 但是,這始終是正確的嗎?還是在某些情況下不起作用? 換句話說:是否存在使用ISO-8859-1解碼/重新編碼任意字節數組不會導致原始字節數組的情況?

由於ISO-8859-1是每個字符編碼1個字節,因此它將始終有效。 UTF-8字節被轉換為不正確的字符,但是幸運的是,沒有信息丟失。

使用ISO-8859-1編碼將字符改回字節將為您提供原始字節數組,其中包含以UTF-8編碼的字符,因此您可以使用正確的編碼安全地重新解釋它。

相反的事實並非總是如此,因為UTF-8是多字節編碼。 編碼過程可能遇到無效的字節序列,並用替換字符替換它們? 到那時,您已經丟失了信息,無法再恢復原始字節。

¹如果您堅持使用0-127范圍內的字符,那么它將起作用,因為它們是使用單個字節以UTF-8編碼的。

UTF-8和ISO-88-1以相同的方式編碼ASCII特征。 鑒於此,您不應僅因為原始輸入為ASCII就不會有任何損失。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM