簡體   English   中英

UTF-8和ISO 8859-1之間的轉換:

[英]Conversion between UTF-8 and ISO 8859-1:

我在SO中找到了以下代碼 這真的有效嗎?

String xml = new String("áéíóúñ");
byte[] latin1 = xml.getBytes("UTF-8");
byte[] utf8 = new String(latin1, "ISO-8859-1").getBytes("UTF-8");

我的意思是, latin1在第二行中以UTF-8編碼,但是在第三行中讀取了als ISO-8859-1-編碼? 這可以工作嗎?

並不是說我不想批評引用的代碼,我只是感到困惑,因為我遇到了一些非常相似的舊代碼,這似乎行得通,而且我無法解釋原因。

編輯:我猜在原始帖子中 ,第2行中的“ UTF-8”只是一個TYPO。 但是我不確定...

EDIT2:在我的最初發布之后,有人編輯了上面的代碼,並將第二行更改為byte[] latin1 = xml.getBytes("ISO-8859-1"); 我不知道是誰做的,為什么他這樣做,但是顯然這很混亂。 對所有看到錯誤版本的代碼的人表示抱歉。 我不知道是誰編輯的。 上面的代碼現在是正確的。

getBytes(Charset charset)導致使用charset編碼的字節數組,因此latin1是UTF-8編碼的。

System.out.println(latin1.length); 作為第三行,它將告訴您字節數組的長度為12。這意味着它實際上是UTF-8編碼的。

new String(latin1, "ISO-8859-1")不正確,因為latin1是UTF-8編碼的,您要告訴它將其解析為ISO-8859-1。 這就是為什么它會生成由12個垃圾符號組成的String的原因: áéÃóúñ

當您使用UTF-8編碼從áéÃóúñ獲取字節時,它將導致一個24個長字節的數組。

我希望現在一切都清楚了。

這些字符在兩種字符編碼中都存在。 只是UTF-8ISO-8859-1使用了超出ASCII范圍的每個字符的每個不同的字節表示形式。

如果您使用的字符存在於UTF-8中,但沒有出現在ISO-8859-1中,則它當然會失敗。

暫無
暫無

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

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