Почему я не могу сделать привязку char к символу замка unicode в Java? - программирование
Подтвердить что ты не робот

Почему я не могу сделать привязку char к символу замка unicode в Java?

class A {
    public static void main(String[] args) {
        char a = '∀';
        System.out.println(a);
        char castle = '𝍇';
        System.out.println(castle);
    }
}

Я могу сделать char для перевернутого конца. Просто отлично, но когда я пытаюсь сделать замок char, он получает 3 ошибки компиляции. Почему?

$ javac A.java && java A
A.java:5: unclosed character literal
        char castle = '𝍇';
                      ^
A.java:5: illegal character: \57159
        char castle = '𝍇';
                        ^
A.java:5: unclosed character literal
        char castle = '𝍇';
                         ^
3 errors
4b9b3361

Ответ 1

Я подозреваю, что символ замка не вписывается ни в один char, а скорее требует кодовой точки int. В этом случае вы можете использовать его в литерале String, но не как char.

В Javadoc для Character указано:

Тип данных char (и, следовательно, значение, которое инкапсулирует объект Character), основывается на исходной спецификации Unicode, которая определяет символы как 16-битные объекты фиксированной ширины. С тех пор стандарт Unicode был изменен, чтобы допускать символы, для представления которых требуется более 16 бит. Диапазон легальных кодовых пунктов теперь U + 0000 до U + 10FFFF, известный как скалярное значение Unicode.

Итак, я предполагаю, что этот символ требует более 16 бит, поэтому его нужно будет рассматривать как кодовую точку int.

Ответ 2

Если ваш файл исходного кода содержит символы не-ascii (как и этот файл), вы должны убедиться, что javac читает его с надлежащей кодировкой, иначе по умолчанию будет использоваться кодировка, которая, возможно, не та, в которой он был сохранен.

Итак, если вы сохранили файл в UTF-8 из своего редактора, его можно скомпилировать, используя:

javac -encoding utf8 A.java

Обратите внимание, что вы также можете использовать код кодировки unicode вместо фактического символа, что делает код компилируемым без директивы -encoding:

char a = '\u2200';              // The codepoint for the ∀ character
String castle = "\ud834\udf47"; // Being a high-surrogate char, the castle cannot fit a single 16 bit char

Ответ 3

Если вы используете Windows:

  • Создайте новый пустой текстовый документ где угодно и скопируйте прошлое 𝍇 внутри текстового документа.
  • Закройте его и щелкните правой кнопкой мыши → "Свойства" → на вкладке "Общие" в разделе "Размер" 2 -byte.

Как вы видите, 2-байтовый, вам нужно использовать два символа.
Вероятно, вы хотите прочитать о UTF-16