2010-01-05 108 views

回答

87

只要將它轉換爲int

char registered = '®'; 
int code = (int) registered; 

其實有一個從charint的隱式轉換,所以你不必明確指明它,因爲我在前面已經做了,但我會這麼做這個案例讓你明白你想要做什麼。

這會給UTF-16碼單元 - 它是一樣的Unicode代碼點在基本多語種平面定義的任何字符。 (並且只有BMP字符可以表示爲Java中的char值。)正如Andrzej Doyle的答案所述,如果要從任意字符串獲取Unicode碼點,請使用Character.codePointAt()

一旦你得到了UTF-16代碼單元或Unicode碼點,但都是整數,這取決於你與他們做什麼。如果你想要一個字符串表示形式,你需要準確地確定你想要的表示形式。 (例如,如果你知道值將始終是在BMP,您可能希望與U+前綴一個固定的4位的十六進制表示,例如"U+0020"空間。)這是超出了這個問題的範圍,雖然,我們不知道需求是什麼。

+0

這將工作爲每個字符? – Geo 2010-01-05 14:22:55

+2

@Geo:基本多語言平面中的任何內容,是的。您不能在Java中以單個字符表示U + FFFF以上的字符。但是char被有效地定義爲UTF-16碼點。 – 2010-01-05 14:26:49

+8

它適用於每個代表'U + FFFF'下的Unicode字符的'char',但不適用於每個Unicode字符,因爲'char'不能代表所有的Unicode。根據你的'char'的來源,你可能需要做一些更復雜的事情(並且真的應該爲此做好準備)。 – JaakkoK 2010-01-05 14:36:56

30

更完整的,儘管更詳細的,這樣做的方法是使用Character.codePointAt方法。這將處理'高代理'字符,它不能用範圍內的一個整數來表示,而這個整數可以代表一個char

在這個例子中,你已經給這不是絕對必要的 - 如果(Unicode)的字符可以容納一個(Java)的內部char(如registered局部變量),那麼它必須落在\u0000\uffff範圍內,你不需要擔心代理對。但是,如果您正在查看可能更高的代碼點,則可以從String/char數組中調用此方法,以便覆蓋邊緣情況。

例如,而不是

String input = ...; 
char fifthChar = input.charAt(4); 
int codePoint = (int)fifthChar; 

使用

String input = ...; 
int codePoint = Character.codePointAt(input, 4); 

不僅是在這種情況下此略少的代碼,但它會處理代理對檢測你。

0

親愛的朋友,喬恩斯基特說,你可以找到字符小數codebut它不是字符的十六進制代碼,因爲它應該在Unicode中提及,所以你應該代表通過不十六進制編碼在Deciaml字符代碼。

有在http://unicode.codeplex.com的開源工具提供了有關characer或sentece完整信息。

所以最好是創建一個解析器,給一個字符作爲參數,並返回ahexCode作爲字符串

public static String GetHexCode(char character) 
    { 
     return String.format("{0:X4}", GetDecimal(character)); 
    }//end 

希望它能幫助

+0

「所以你應該通過HexCode代表字符代碼而不是Deciaml」 - 它是一個號碼。在將其轉換爲字符串時,Hex和decimal只起作用,並且根本不需要這個問題。 – 2015-07-21 12:02:36

4

在Java中,焦炭在技術上是一個「16位整數「,所以你可以簡單地將它轉換爲int並且你會得到它的代碼。 從Oracle

char數據類型是一個單一的16位Unicode字符。它具有 最小值'\ u0000'(或0)和最大值'\ uffff'(或 65,535)。

所以你可以簡單地將它轉換爲int。

char registered = '®'; 
System.out.println(String.format("This is an int-code: %d", (int) registered)); 
System.out.println(String.format("And this is an hexa code: %x", (int) registered)); 
+1

它甚至可以與歐元字符'String.format(「%x」,(int)'€')== 0x20ac =='\ u20ac'' – ATorras 2015-06-11 13:07:20

0

對我來說,只有「Integer.toHexString(註冊)」工作,我想要的方式:

char registered = '®'; 
System.out.println("Answer:"+Integer.toHexString(registered)); 

這個答案會給你唯一的字符串表示什麼通常與表中。 Jon Skeet的回答更多解釋。

+1

正如我在回答的評論中指出的,那是因爲「你的方式想要「是產生代碼的十六進制表示 - 這不是這個問題的要求。代碼本身是一個整數; 「如何創建一個整數的十六進制表示」的問題是另一回事。 (對於Unicode代碼點,您還應該考慮您需要多少個十六進制數字 - 例如,您可能希望使用4個BMP字符和6個其他字符,或者總是6個,或者總是偶數)... – 2015-07-21 12:24:16

+0

它明確你寫的內容。是什麼讓你認爲代碼是按整數定義的?對我而言,代碼是符號的組合,不一定是數字或整數。你的答案真的非常有用,但最終我花了半個小時,而我發現如何獲得代碼,據我瞭解,也許它會爲其他用戶節省一些免費的時間。 – 2015-07-21 12:35:18

+2

Unicode就是這樣定義它的。來自http://www.unicode.org/standard/principles.html:「Unicode標準定義的每個代碼元素都分配一個編號,每個編號稱爲代碼點,當文本中提到時,以前綴「U +」的形式以十六進制形式列出,例如,代碼點U + 0041是十六進制數0041(等於十進制數65),它表示Unicode標準中的字符「A」。我已經編輯了我的答案,明確了爲什麼「字符代碼」X「的答案是一個數字,而不是一個字符串。 – 2015-07-21 12:38:50