2009-12-20 213 views
5

我正在構建一種語言,一種玩具語言。語法\#0061應該給定的Unicode轉換爲字符:Unicode轉換爲Java中的字符串

String temp = yytext().subtring(2); 

那之後嘗試添加'\u'到字符串,我注意到,產生錯誤。我也試過"\\" + "u" + temp;這種方式不做任何轉換。

我基本上試圖通過提供一個方法,幫助只提供'0061' Unicode轉換爲字符。

+0

請注意,16位(4個十六進制數字)不足以表示Unicode中的所有字符。在java中,「\ u1234」映射到UTF-16的代碼點單元,它與字符不一樣。 –

+0

附錄:實際上,它是映射到UTF-16代碼點單位的java數據類型字符,而不是實際的Unicode字符。 –

回答

11

刪除'#'並使用Integer.parseInt("0061", 16)將十六進制數字轉換爲int。然後投射到char。如果你已經手工實現了詞法分析器,另一種方法是當你的詞法分析器與unicode字面匹配時,可以隨時進行轉換。但是在重讀這個問題時,我看到你正在使用詞法分析器。 。好動!)

+1

只是好奇:你是怎麼發現他在使用詞法分析器? – BalusC

+1

@BalusC由於'yytext',一個lex特定變量 –

+0

這是正確的Pascal –

0

\uXXXX是一個轉義序列。在執行之前,它已經被轉換成實際的字符值,它在運行時不會被「評估」。

您可能想要做的是定義從#XXXX語法到Unicode代碼點的映射並將它們投射到char

2

你需要將特定的碼點轉換爲char。你可以做到這一點與正則表達式的一點幫助:

String string = "blah #0061 blah"; 

Matcher matcher = Pattern.compile("\\#((?i)[0-9a-f]{4})").matcher(string); 
while (matcher.find()) { 
    int codepoint = Integer.valueOf(matcher.group(1), 16); 
    string = string.replaceAll(matcher.group(0), String.valueOf((char) codepoint)); 
} 

System.out.println(string); // blah a blah 

編輯按照意見,如果它是一個單一的令牌,然後就去做:

String string = "0061"; 
char c = (char) Integer.parseInt(string, 16); 
System.out.println(c); // a 
+0

Erm ...你不想使用Java正則表達式模式匹配來實現一個詞法分析器。 –

+0

有效的點,我已經相應地更新了答案。 – BalusC

+0

我需要你發佈的第一個例子。我運行代碼,使模式更改,因爲我需要它們,但是ReplaceAll不會取代任何東西。該字符串與原始字符串相同:( – 2012-05-22 13:16:08

2

我基本上是試圖通過提供 只有'0061'給方法,幫助,將 unicode轉換爲字符。

char fromUnicode(String codePoint) { 
    return (char) Integer.parseInt(codePoint, 16); 
} 

您需要處理不良輸入等,但會以其他方式使用。