Я создаю язык, игрушечный язык. Синтаксис \#0061
как предполагается, преобразовывает данный Unicode в символ:
String temp = yytext().subtring(2);
Затем после той попытки добавить '\u'
к строке я заметил, что генерировал ошибку.
Я также пытался "\\" + "u" + temp;
этот путь не делает никакого преобразования.
Я в основном пытаюсь преобразовать Unicode в символ путем предоставления только '0061'
к методу, справке.
Удалите символ «#» и используйте Integer.parseInt («0061», 16)
для преобразования шестнадцатеричных цифр в int
. Затем приведите к char
.
(Если бы вы реализовали лексер вручную, в качестве альтернативы можно было бы выполнять преобразование «на лету», поскольку ваш лексер соответствует литералу Unicode. Но, перечитав вопрос, я вижу, что вы используете генератор лексера ... хороший ход!)
я в основном пытаюсь преобразовать юникод для символа, предоставив только '0061' для метода, помогите.
char fromUnicode(String codePoint) {
return (char) Integer.parseInt(codePoint, 16);
}
Вам нужно обрабатывать неверные вводы и тому подобное, но это будет работать в противном случае.
Вам необходимо преобразовать конкретную кодовую точку в 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
\ uXXXX
- escape-последовательность. Перед выполнением он уже был преобразован в фактическое символьное значение, он не «оценивается» во время выполнения.
Что вы, вероятно, захотите сделать, так это определить отображение синтаксиса #XXXX
в код Unicode очков и преобразовать их в char
.