Как использовать escape-последовательность Unicode с переменными?

Это код, который мне в настоящее время приходится объединять a, затем b, затем c и т. д. в цикле (количество просмотров) с использованием java:

public String toString()
{
  String answers = "";
  int numChoices = choices.length;
  char letter;
  String result;
  int letterNum = 0061;
  while (numChoices > 0)
  {
     letter = "\u" + letterNum;
     result  = letter + ") " + choices[choices.length-numChoices] + "\n";
     answers += result;
     numChoices --;
     letterNum ++;
  }

  return question + "\n" + answers;
}

Я думал, что escape-последовательности Unicode будут моим лучшим вариантом, но это не сработало так, как я пытался, поэтому я явно делаю что-то не так. Как это исправить?

Ошибка, которую я получаю:

MultChoice.java:40: illegal unicode escape
     letter = "\u" + letterNum;

person TCob    schedule 21.02.2015    source источник
comment
0061 - это 49, что является ASCII для 1, и вы, кажется, перечисляете варианты, зачем вам вообще нужно экранирование? Просто используйте нормальные значения 1, 2, 3 и т.д.   -  person Andrei Nikolaenko    schedule 21.02.2015


Ответы (2)


Эскейп-последовательности Unicode обрабатываются javac очень в начале компиляции, перед синтаксическим анализом. Компилятор никогда не видит escape-последовательности Unicode, только кодовые точки. Поэтому вы не можете использовать их во время выполнения. Вместо этого попробуйте следующее:

public String toString()
{
  String answers = "";
  int numChoices = choices.length;
  char letter = 'a';
  String result;
  while (numChoices > 0)
  {
     result  = "" + letter + ") " + choices[choices.length-numChoices] + "\n";
     answers += result;
     numChoices --;
     letter ++;
  }

  return question + "\n" + answers;
}

char — это просто 16-битное целое число без знака, так что с ним можно делать все обычные операции с целыми числами, например приращение. Нет необходимости в отдельном int--'a' и (char) 0x61 это одно и то же.

person Steve McKay    schedule 21.02.2015
comment
Спасибо за помощь. Я понятия не имел, что это может сработать. - person TCob; 21.02.2015
comment
Теперь заставьте его работать со всеми кодовыми точками Unicode, а не только с BMP. - person tchrist; 22.02.2015
comment
Работа с дополнительными плоскостями в Java — это боль. Это также выходит за рамки этого вопроса или ответа. - person Steve McKay; 22.02.2015

Значение letterNum равно 49 (61 в восьмеричном), поэтому оно превращается в "\u49", что недопустимо.

Возможно, вы должны были использовать 0x0061, а затем превратить его в String с помощью Integer.toHexString(letterNum).

Редактировать: кажется, что вы не можете создать String, используя "\u" + something.

Итак, возможный путь Character.toString((char) letterNum).

person Bubletan    schedule 21.02.2015