2011-04-20 80 views
12

如何獲取java中字符串的unicode值?Java字符串Unicode值

例如,如果字符串是「你好」 我需要這樣的東西爲\ uXXXX爲\ uXXXX

+3

爲什麼?你想要做什麼? 'charAt()'會有所幫助。如果你想要Unicode代碼而不是UTF-16代碼單元,那麼'codePointAt()'是更正確的方法(但是如果你想爲Java源代碼或類似代碼編寫'\ u'轉義則不會有幫助。 – 2011-04-20 17:01:03

+0

爲了簡化一切,我有一個來自java源文件的英文字符串。它被轉換成日語。然後我需要\ uXXXX unicode值,因爲在源文件中英文字符串將被日文替換。 – user489041 2011-04-20 17:05:27

+0

@user:在這種情況下,通過'charAt()'將值返回格式化爲4位數的十六進制數,並且應該預先設置'\ u'。 – 2011-04-20 17:07:28

回答

18

某些unicode字符跨兩個Java字符。從http://docs.oracle.com/javase/tutorial/i18n/text/unicode.html引用:

與是16位的範圍之外,並從0x10000的到在0x10FFFF的範圍內的值的字符,被稱爲補充字符,並且被定義爲一對char值。

逃避非ASCII正確的方法:

private static String escapeNonAscii(String str) { 

    StringBuilder retStr = new StringBuilder(); 
    for(int i=0; i<str.length(); i++) { 
    int cp = Character.codePointAt(str, i); 
    int charCount = Character.charCount(cp); 
    if (charCount > 1) { 
     i += charCount - 1; // 2. 
     if (i >= str.length()) { 
     throw new IllegalArgumentException("truncated unexpectedly"); 
     } 
    } 

    if (cp < 128) { 
     retStr.appendCodePoint(cp); 
    } else { 
     retStr.append(String.format("\\u%x", cp)); 
    } 
    } 
    return retStr.toString(); 
} 
+0

不錯!很酷的例子 – user489041 2013-02-11 23:15:09

11

此方法轉換任意String成ASCII安全表示在Java源代碼中使用(或屬性文件,例如):

public String escapeUnicode(String input) { 
    StringBuilder b = new StringBuilder(input.length()); 
    Formatter f = new Formatter(b); 
    for (char c : input.toCharArray()) { 
    if (c < 128) { 
     b.append(c); 
    } else { 
     f.format("\\u%04x", (int) c); 
    } 
    } 
    return b.toString(); 
} 
+0

真棒,完美工作。謝謝 – user489041 2011-04-20 18:08:07

+1

@ user489041:我不同意:正確的做法是用'java -encoding UTF-8'編譯。沒有混亂,沒有大驚小怪。特別是因爲20年來,Java仍然沒有標準的方式來用他們的正式名稱來談論代碼點。這意味着你正試圖在你的代碼中插入邪惡和神祕的魔法數字。這不是一件好事!當然,我可能更願意看到「\ N {希臘小寫字母ALPHA}」而不是「α」,但是I ** SURELY **不想看到「\ u03B1」!這只是邪惡的。你將如何保持這種crudola? – tchrist 2011-04-23 22:40:33

+0

只有4位數? Unicode是一個32位字符集,OP講日語。 – Martin 2012-08-28 11:17:33