0

在我指定的項目,原作者寫一個函數:Java中的中文字符串處理?

public String asString() throws DataException 
    { 
    if (getData() == null) return null; 

    CharBuffer charBuf = null; 

    try 
    { 
     charBuf = s_charset.newDecoder().decode(ByteBuffer.wrap(f_data)); 
    } 
    catch (CharacterCodingException e) 
    { 
     throw new DataException("You can't have a string from this ParasolBlob: " + this, e); 
    } 

    return charBuf.toString()+"你好"; 
} 

請注意,不斷s_charset被定義爲:

private static final Charset s_charset = Charset.forName("UTF-8"); 

還請注意,我硬編碼中國返回字符串中的字符串。

現在,當程序流到達這個方法,它會拋出以下異常:

java.nio.charset.UnmappableCharacterException: Input length = 2 

而且更interstingly,硬編碼字符串中國將顯示爲「?」在控制檯,如果我做一個System.out.println()。

我覺得這個問題在本地化方面很有意思。我試過將它改爲 Charset.forName(「GBK」);

但似乎不是解決方案。另外,我已經將Java類的編碼設置爲「UTF-8」。

任何專家都有這方面的經驗?你能分享一下嗎?提前致謝!

回答

3

而且更多的是,硬編碼的中文字符串將顯示爲 「??」在控制檯,如果我做一個System.out.println()。

System.out執行從UTF-16字符串到默認JRE字符編碼的轉碼操作。如果這不匹配,則接收字符數據的設備使用的編碼已損壞。所以,應該將控制檯設置爲使用正確的字符編碼(UTF-8)來正確渲染中文字符。

如果你使用eclipse,那麼你可以去

運行配置 - 更改控制檯編碼>通用 - >編碼(slect UTF-8從下拉菜單)

enter image description here

+0

+1,但我不確定OP是否意味着eclipse的控制檯。如果你正在使用窗口,它更復雜。但這個討論會幫助你:http://stackoverflow.com/questions/388490/unicode-characters-in-windows-command-line-how – AlexR

+0

它現在在我的控制檯上運行良好,謝謝。但我的最終目標是提取字符串並將其輸出到csv文件。它仍然顯示爲?在csv文件中。我已經設置了csv的編碼。 – Kevin

+0

@Kevin閱讀[this](http://stackoverflow.com/a/16436195/1163607)。 – NINCOMPOOP

0

Java字符串是unicodes

System.out.println("你好"); 
0

正如Kevin所說,取決於源文件的底層編碼是什麼,此編碼將用於將其轉換爲UTF-16BE(Java String的真實編碼)。所以當你看到「??」這肯定是簡單的轉換錯誤。

現在,如果你想將簡單的字節數組轉換爲字符串,使用給定的字符編碼,我相信有比使用原始CharsetDecoder更簡單的方法來做到這一點。那就是:

byte[] bytes = {0x61}; 
String string = new String(bytes, Charset.forName("UTF-8")); 
System.out.println(string); 

如果字節數組真的包含UTF-8編碼的字節流,這將起作用。它必須沒有BOM,否則轉換可能會失敗。確保您嘗試轉換的內容不是從序列0xEF 0xBB 0xBF開始。