2013-02-22 91 views
0

如何將任何UTF8字符串轉換爲可讀的字符串。將UTF-8編碼的字符串轉換爲可讀的字符串

像:â¬(在UTF8)爲€

我嘗試使用字符集,但不工作。

+0

你想達到什麼目的?弦從哪裏來? – 2013-02-22 08:13:27

+0

我只是想將不可讀的UTF8格式的字符串轉換爲可重用的字符串(ASCII或其他可讀的字符集)。 – pradeep 2013-02-22 08:16:20

+0

我從其他問題' – pradeep 2013-02-22 08:16:41

回答

1

您正在使用byte[] b = "Üü?öäABC".getBytes("ISO-8859-15");對ISO-8859-15進行編碼,然後用UTF-8 System.out.println(new String(b, "UTF-8"));對其進行解碼。您必須使用ISO-8859-15進行相同的解碼。

+0

我也用ISO-8859-15解碼。 – pradeep 2013-02-22 08:18:58

+0

嗯,是的,工作的那條線是正確的'System.out。println(new String(b,「ISO-8859-15」));'。它使用ISO-8859-15解碼器解碼ISO-8859-15編碼的字符串。另一行用UTF-8解碼ISO-8859-15編碼的字符串。當然,它不會工作。 – jdb 2013-02-22 08:22:07

+0

將x作爲x進行編碼並將其解碼爲x完全沒有意義。它不會做任何事情,最好的情況是它會失去更多的信息。 – Esailija 2013-02-22 08:46:40

0

您正在嘗試以 「ISO-8859-15」 編碼的ByteArray以 「UTF-8」 格式

 b = "Üü?öäABC".getBytes("ISO-8859-15"); 
     u = "Üü?öäABC".getBytes("UTF-8"); 

    System.out.println(new String(b, "ISO-8859-15")); // will be ok 
    System.out.println(new String(b, "UTF-8")); // will look garbled 
    System.out.println(new String(u,"UTF-8")); // will be ok 
+0

如何啓用UTF-8控制檯? – pradeep 2013-02-22 08:21:22

+1

in Eclipse - > RunAs-> Runconfiguration-> commons-> Encoding – PbxMan 2013-02-22 08:24:01

+0

把x編碼成x然後解碼成x完全沒有意義。它不會做任何事情,最好的情況是它會失去更多的信息。 – Esailija 2013-02-22 08:47:13

1

這不是 「UTF-8」,但完全斷裂和不可修復數據進行解碼。字符串沒有編碼。在這種情況下說「UTF-8」字符串是沒有意義的。字符串是一個抽象字符的字符串 - 它沒有任何編碼,除非作爲內部實現細節,這不是我們所關心的並且與您的問題無關。

+0

這是不正確的。字符串**總是**有編碼。即使在內存中,*邏輯*字符也必須*物理*編碼。 Java字符串在內存中使用UTF-16。如果您有一個包含UTF-16編碼的UTF-8八位字節的字符串,那麼您可以將字符值原樣複製到Byte數組,然後使用String構造函數將它們解碼爲正常的UTF-16編碼字符串,字節數組和編碼作爲輸入。 – 2013-02-22 18:38:20

+0

@RemyLebeau我想你只讀了我的答案的第一句話。除了處理星體飛機時,內部編碼是無關緊要的 - 在這種情況下,UTF-16的選擇泄露給用戶。存儲二進制數據的數據類型(例如編碼文本)是byte [],而不是String。 – Esailija 2013-02-22 19:53:01

1

java中的字符串已經是unicode表示。當你調用其中一個getBytes方法時,你會得到一個編碼表示(作爲字節,因此二進制值)在特定的編碼 - 在你的例子ISO-8859-15。如果你想把這個字節數組轉換回一個unicode字符串,你可以用一個字符串構造函數來接受一個字節數組,就像你做的那樣,但是你必須使用完全相同的編碼字節數組最初生成的用。只有這樣你才能將它轉換回一個unicode字符串(它沒有編碼,並且不需要)。

要小心無編碼方法,字符串構造函數和getBytes方法,因爲它們使用運行代碼的平臺的默認編碼,這可能不是您想要實現的。

0

我認爲這裏的問題是,你假設一個java字符串編碼與你在構造函數中指定的任何東西。 不是。它是UTF-16。

因此,"Üü?öäABC".getBytes("ISO-8859-15")實際上是將UTF-16字符串轉換爲ISO-8859-15,然後獲取該字節的表示形式。

如果您希望在Eclipse控制檯中獲得人類可讀的格式,請保持原樣(UTF-16) - 並調用System.out.println("Üü?öäABC"),因爲您的Eclipse控制檯將解碼字符串並將其顯示爲UTF- 16。