我正在構建一種語言,一種玩具語言。語法\#0061
應該給定的Unicode轉換爲字符:Unicode轉換爲Java中的字符串
String temp = yytext().subtring(2);
那之後嘗試添加'\u'
到字符串,我注意到,產生錯誤。我也試過"\\" + "u" + temp;
這種方式不做任何轉換。
我基本上試圖通過提供一個方法,幫助只提供'0061'
Unicode轉換爲字符。
我正在構建一種語言,一種玩具語言。語法\#0061
應該給定的Unicode轉換爲字符:Unicode轉換爲Java中的字符串
String temp = yytext().subtring(2);
那之後嘗試添加'\u'
到字符串,我注意到,產生錯誤。我也試過"\\" + "u" + temp;
這種方式不做任何轉換。
我基本上試圖通過提供一個方法,幫助只提供'0061'
Unicode轉換爲字符。
刪除'#'並使用Integer.parseInt("0061", 16)
將十六進制數字轉換爲int
。然後投射到char
。如果你已經手工實現了詞法分析器,另一種方法是當你的詞法分析器與unicode字面匹配時,可以隨時進行轉換。但是在重讀這個問題時,我看到你正在使用詞法分析器。 。好動!)
\uXXXX
是一個轉義序列。在執行之前,它已經被轉換成實際的字符值,它在運行時不會被「評估」。
您可能想要做的是定義從#XXXX
語法到Unicode代碼點的映射並將它們投射到char
。
你需要將特定的碼點轉換爲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
Erm ...你不想使用Java正則表達式模式匹配來實現一個詞法分析器。 –
有效的點,我已經相應地更新了答案。 – BalusC
我需要你發佈的第一個例子。我運行代碼,使模式更改,因爲我需要它們,但是ReplaceAll不會取代任何東西。該字符串與原始字符串相同:( – 2012-05-22 13:16:08
我基本上是試圖通過提供 只有'0061'給方法,幫助,將 unicode轉換爲字符。
char fromUnicode(String codePoint) {
return (char) Integer.parseInt(codePoint, 16);
}
您需要處理不良輸入等,但會以其他方式使用。
請注意,16位(4個十六進制數字)不足以表示Unicode中的所有字符。在java中,「\ u1234」映射到UTF-16的代碼點單元,它與字符不一樣。 –
附錄:實際上,它是映射到UTF-16代碼點單位的java數據類型字符,而不是實際的Unicode字符。 –