2012-02-17 22 views
1

我在SO中發現了以下code。這真的有用嗎?UTF-8與ISO 8859-1之間的轉換:

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編碼?這可以工作嗎?

不是我不想批評引用的代碼,我只是因爲碰到一些非常相似的遺留代碼而感到困惑,這似乎很奏效,我無法解釋原因。

編輯:我想在原來的post,第2行的「UTF-8」只是一個TYPO。但我不確定...

編輯2:在我最初發布後,有人編輯了上面的代碼並將第二行更改爲byte[] latin1 = xml.getBytes("ISO-8859-1");。我不知道是誰做的,爲什麼他這麼做,但顯然這很糟糕。很抱歉,所有看到錯誤版本的代碼的人都是。我不知道是誰編輯的。上面的代碼現在是正確的。

+1

你這樣做是錯的。不要解碼。不要getBYTES。只需使用'java -encoding UTF-8'或任何真正的編碼進行編譯。 Java具有可以容忍的Unicode支持,但默認值對您不利。 – tchrist 2012-02-17 15:38:17

+0

你的直覺是正確的;第2行是一個錯字或錯誤。該代碼將UTF-16字符串轉碼爲UTF-8,然後將數據轉換爲ISO-8859-1並將其轉碼回UTF-16垃圾。然後,損壞的字符串被轉碼爲UTF-8,導致更多的垃圾。 – McDowell 2012-02-17 15:42:00

回答

4

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個符號的垃圾組成的字符串:áéíóúñ

當您使用UTF-8編碼從áéíóúñ獲取字節時,它會生成24個長字節數組。

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

0

這些字符出現在兩個字符編碼中。只是UTF-8ISO-8859-1使用超出ASCII範圍的每個字符的每個不同的字節表示。

如果您使用了UTF-8中存在但不存在於ISO-8859-1中的字符,那麼它當然會失敗。