我正在建立一种语言,一种玩具语言。语法\#0061
应该将给定的Unicode转换为字符:
String temp = yytext().subtring(2);
然后尝试将'\u'
附加到字符串后,我注意到生成了错误。
我也试过"\\" + "u" + temp;
这种方式不做任何转换。
我基本上只想通过向方法提供'0061'
来帮助将Unicode转换为字符。
答案 0 :(得分:11)
去掉'#'并使用Integer.parseInt("0061", 16)
将十六进制数字转换为int
。然后转为char
。
(如果你手动实现了词法分析器,或者当你的词法分析器匹配unicode文字时,可以动态地进行转换。但是在重新阅读问题时,我看到你正在使用词法分析器...好动!)
答案 1 :(得分: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
答案 2 :(得分:2)
我基本上试图转换 通过提供unicode到一个角色 只有'0061'的方法,帮助。
char fromUnicode(String codePoint) {
return (char) Integer.parseInt(codePoint, 16);
}
您需要处理不良输入等,但这样做会有效。
答案 3 :(得分:0)
\uXXXX
是转义序列。在执行之前,它已经被转换为实际的字符值,它在运行时无论如何都不会被“评估”。
您可能要做的是定义从#XXXX
语法到Unicode代码点的映射,并将它们转换为char
。