2012-07-07 139 views
5

正如標題說... 我讀htto響應如何將在Windows-1250/Cp1250中編碼的字符串轉換爲utf-8?



    InputStream is = response.getEntity().getContent(); 
    String cw = IOUtils.toString(is); 
    byte[] b = cw.getBytes("Cp1250"); 
    String x = StringUtils.newStringUtf8(b); 
    String content = new String(b, "UTF-8"); 

    System.out.println(content); 

我已經試過很多變化的內容。我對什麼是用作字符串的正確編碼常量有點困惑。 windows-1250或Cp1250。 UTF-8或utf-8或utf8?

回答

6

您似乎認爲String對象具有編碼。這是不正確的。編碼用作從二進制數據(一個byte[]InputStream)到文本數據(一個Stringchar[]等)的翻譯的一部分。

目前還不清楚IOUtils.toString正在做什麼,但它幾乎肯定會丟失數據或至少處理不當。如果您的數據最初是在Windows-1250中,那麼您應該使用包裝InputStreamInputStreamReader,指定InputStreamReader構造函數調用中的字符集。

目前尚不清楚其中UTF-8進來 - 你可能想寫出在UTF-8之後的數據,但該結果將是byte[],而不是一個字符串。

+2

從技術上講,'java.lang。String'有一個編碼:UTF-16。 – 2015-06-03 11:29:00

4

您正在向後轉換。您需要將輸入數據作爲byte數組,然後使用String(byteArray, "Cp1250")創建String對象。那麼如果你想使用UTF-8,請使用String.getBytes("UTF-8")

3

編碼有一個規範(唯一)名稱和其他不同名稱,並且不區分大小寫。例如「UTF-8」是規範的名稱,但是一些java版本的它是「UTF8」;它寫得更多的是常見的用法。 「Windows-1250」也是如此,您可能也會在HTML頁面中看到這些。 「Cp1250」(Code-Page)是一個java內部名稱。

在java byte []中是二進制數據,String(內部Unicode)是文本。 兩者之間的轉換需要一種編碼,但通常是可選的,但需要使用操作系統默認值。

字節,的InputStream,OutputStream的< - >字符串,字符,閱讀器,寫入器

String cw = IOUtils.toString(is, "UTF-8"); // InputStream is binary gives byte[], hence give encoding 
byte[] b = cw.getBytes("Cp1250"); 
String x = new String(b, "Cp1250"); 
String content = s; 

System.out.println(content); 

爲了允許這種通用(QUA編碼)字符串,字符串內部使用炭,UTF-16。 字符串常量以UTF-8(更緊湊)存儲在.class文件中。

-1

我認爲使用掃描儀更好地閱讀不同的字符集。

FileInputStream is = new FileInputStream(fileOrPath); 
    Scanner scanner = new Scanner(is, "cp1250"); 
    String out = scanner.next(); 

和方法next()返回應用程序的字符集String值。

從「cp1250」到「UTF-8」的「捷克語言」測試。

相關問題