2013-10-09 38 views
1

Java不支持所有的UTF8字符,像如何更換使用Java UNSUPPORT utf8字符

public static void main(String[] args){ 

    Character cha = new Character('\uD841'); 
    System.out.println(cha.compareTo(Character.MIN_VALUE)); 
    String ts = "this is a test string"; 
    StringBuilder sb = new StringBuilder(); 
    sb.append(ts); 
    sb.append(cha); 
    ts = sb.toString(); 
    for(int i =0;i<ts.length();i++){ 
     System.out.println(Character.isLetter(ts.charAt(i))); 
    } 
} 

這將打印「這是一個測試字符串?」 如何確保哪個字符不被支持?

+0

你的例子不會打印「這是一個測試字符串?」,而是一串真/假行。你期望它打印什麼?您可能也對[this]感興趣(http://docs.oracle.com/javase/7/docs/api/java/lang/Character.html#supplementary)。 – Bruno

回答

7

您所看到的不是「Java不支持字符」,而是「您的控制檯不支持該字符」或「您的平臺默認編碼不支持您的字符」。

  1. 有沒有這樣的事,作爲一個「UTF-8字符」,這是一個「Unicode字符」,如果你堅持
  2. Java可以處理在當前Unicode標準的所有字符就好
  3. 當寫一個文件或控制檯,它使用編碼將這些字符轉換爲字節(因爲這是通用接口)。
  4. 如果您只是打印到System.out那麼它使用平臺默認編碼。如果平臺默認編碼不能編碼字符,那麼該字符將轉換爲替換字符(默認爲?)。

最後但並非最不重要的是:\uD841 is not a valid Unicode character!這是一個很高的代理值,並且明確地將它們排除在Unicode標準之外(因爲它們在UTF-16中用於對BMP以外的字符進行編碼)。

+0

+1好的答案。一個問題:Java的'char'只是16位,它能處理32位字符嗎? –

+1

@ Eng.Fouad:不,它不能獨立存在,但是'String'可以用2個'char'值(基本上實現UTF-16)來表示它。你可以直接用'String.getCodePointAt()'和相關的方法(返回int值)來訪問它們。 –