Что такое "соединительные символы" в идентификаторах Java?


Я читаю для SCJP и у меня есть вопрос относительно этой строки:

идентификаторы должны начинаться с буквы, символа валюты ($), или соединительный символ, например символ подчеркивания ( _ ). Идентификаторы не могут начните с числа!

Он утверждает, что допустимое имя идентификатора может начинаться с соединительного символа например подчеркивания. Я думал, что подчеркивания были единственным допустимым вариантом? Какие еще подключение персонажи есть?

7   202   2012-08-02 12:54:26

7 ответов:

вот список соединительных символов. Это символы, используемые для соединения слов.

http://www.fileformat.info/info/unicode/category/Pc/list.htm

U+005F _ LOW LINE
U+203F ‿ UNDERTIE
U+2040 ⁀ CHARACTER TIE
U+2054 ⁔ INVERTED UNDERTIE
U+FE33 ︳ PRESENTATION FORM FOR VERTICAL LOW LINE
U+FE34 ︴ PRESENTATION FORM FOR VERTICAL WAVY LOW LINE
U+FE4D ﹍ DASHED LOW LINE
U+FE4E ﹎ CENTRELINE LOW LINE
U+FE4F ﹏ WAVY LOW LINE
U+FF3F _ FULLWIDTH LOW LINE

это компилируется на Java 7.

int _, ‿, ⁀, ⁔, ︳, ︴, ﹍, ﹎, ﹏, _;

пример. В данном случае tp - это имя столбца и значение для конкретной строки.

Column<Double> ︴tp︴ = table.getColumn("tp", double.class);

double tp = row.getDouble(︴tp︴);

далее

for (int i = Character.MIN_CODE_POINT; i <= Character.MAX_CODE_POINT; i++)
    if (Character.isJavaIdentifierStart(i) && !Character.isAlphabetic(i))
        System.out.print((char) i + " ");
}

печать

$ _ ¢ £ ¤ ¥ ؋ ৲ ৳ ૱ ௹ ฿ ៛ ‿ ⁀ ⁔ ₠ ₡ ₢ ₣ ₤ ₥ ₦ ₧ ₨ ₩ ₪ ₫ € ₭ ₮ ₯ ₰ ₱ ₲ ₳ ₴ ₵ ﷼ ︳ ︴ ﹍ ﹎ ﹏ ﹩ $ _ ¢ £ ¥ ₩

повторите все 65K символов и спросите Character.isJavaIdentifierStart(c). Ответ:" undertie " decimal 8255

окончательная спецификация юридического идентификатора Java может быть найдена в Спецификация Языка Java.

здесь символов соединитель в Unicode. Вы не найдете их на клавиатуре.

U + 005F НИЗКАЯ ЛИНИЯ _
U + 203F UNDERTIE ‿
U + 2040 ХАРАКТЕР ГАЛСТУК ⁀
U + 2054 ПЕРЕВЕРНУТОЕ НИЖНЕЕ БЕЛЬЕ ⁔
U + FE33 ФОРМА ПРЕДСТАВЛЕНИЯ ДЛЯ ВЕРТИКАЛЬНОЙ НИЖНЕЙ ЛИНИИ ︳
U + FE34 ФОРМА ПРЕДСТАВЛЕНИЯ ДЛЯ ВЕРТИКАЛЬНОЙ ВОЛНИСТОЙ НИЗКОЙ ЛИНИИ ︴
U + FE4D ПУНКТИРНАЯ НИЗКАЯ ЛИНИЯ ﹍
U + FE4E ОСЕВАЯ ЛИНИЯ НИЗКАЯ ЛИНИЯ ﹎
ЛИНИЯ U + FE4F ВОЛНИСТАЯ НИЗКАЯ ﹏
U + FF3F FULLWIDTH LOW LINE _

соединительный символ используется для соединения двух персонажей.

в Java соединительный символ-это тот, для которого символ.getType (int codePoint)/символ.getType (char ch) возвращает значение, равное символ.CONNECTOR_PUNCTUATION.

обратите внимание, что в Java информация о символах основана на стандарте Unicode, который идентифицирует соединительные символы, назначая им общую категорию Pc, которая является псевдонимом ибо Connector_Punctuation.

следующий фрагмент кода

for (int i = Character.MIN_CODE_POINT; i <= Character.MAX_CODE_POINT; i++) {
    if (Character.getType(i) == Character.CONNECTOR_PUNCTUATION
            && Character.isJavaIdentifierStart(i)) {
        System.out.println("character: " + String.valueOf(Character.toChars(i))
                + ", codepoint: " + i + ", hexcode: " + Integer.toHexString(i));
    }
}

выводит соединительные символы, которые можно использовать для запуска идентификатора на jdk1.6. 0_45

character: _, codepoint: 95, hexcode: 5f
character: ‿, codepoint: 8255, hexcode: 203f
character: ⁀, codepoint: 8256, hexcode: 2040
character: ⁔, codepoint: 8276, hexcode: 2054
character: ・, codepoint: 12539, hexcode: 30fb
character: ︳, codepoint: 65075, hexcode: fe33
character: ︴, codepoint: 65076, hexcode: fe34
character: ﹍, codepoint: 65101, hexcode: fe4d
character: ﹎, codepoint: 65102, hexcode: fe4e
character: ﹏, codepoint: 65103, hexcode: fe4f
character: _, codepoint: 65343, hexcode: ff3f
character: ・, codepoint: 65381, hexcode: ff65

следующие компиляции на jdk1.6. 0_45,

int _, ‿, ⁀, ⁔, ・, ︳, ︴, ﹍, ﹎, ﹏, _, ・ = 0;

по-видимому, приведенное выше объявление не удается скомпилировать на jdk1.7.0_80 & jdk1.8.0_51 для следующих двух соединительных символов (обратная совместимость...ой!!!),

character: ・, codepoint: 12539, hexcode: 30fb
character: ・, codepoint: 65381, hexcode: ff65

в любом случае, детали в сторону, экзамен фокусируется только на основной латинский набор символов.

кроме того, для юридических идентификаторов на Java предоставляется спецификация здесь. Используйте API класса символов для получения более подробной информации.

одним из самых, Ну, забавных символов, который разрешен в идентификаторах Java (однако не в начале), является символ unicode с именем "Zero Width Non Joiner" (, U + 200C,https://en.wikipedia.org/wiki/Zero-width_non-joiner).

У меня было это однажды в куске XML внутри значения атрибута, содержащего ссылку на другой кусок этого XML. Поскольку ZWNJ-это "нулевая ширина", ее нельзя увидеть (за исключением случаев, когда вы идете вместе с курсором, он отображается прямо на экране). характер раньше). Его также нельзя было увидеть в файле журнала и/или выводе консоли. Но он был там все время: copy & paste в поля поиска получил его и, таким образом, не нашел указанную позицию. Ввод строки (видимая часть) в поле поиска, однако, нашел указанную позицию. Мне потребовалось время, чтобы понять это.

ввод нулевой ширины-не-столяр на самом деле довольно легко (слишком легко) при использовании европейской раскладки клавиатуры, по крайней мере, в ее немецком варианте, например "Europatastatur 2.02" - это достижимо с AltGr+".", две клавиши, которые, к сожалению, расположены непосредственно рядом друг с другом на большинстве клавиатур и могут быть легко нажаты вместе случайно.

назад к Java: я подумал, что вы могли бы написать такой код:

void foo() {
    int i = 1;
    int i‌ = 2;
}

со вторым я добавил нулевую ширину-не столяр (не могу сделать это в приведенном выше коде, вырезанном в Редакторе stackoverflow), но это не сработало. IntelliJ (16.3.3) не жаловался, но JavaC (Java 8) жаловался на уже определенный идентификатор-кажется, JavaC фактически позволяет символу ZWNJ как часть идентификатора, но при использовании отражения, чтобы увидеть, что он делает, символ ZWNJ удаляется с идентификатора - что-то, что символы, такие как‿, не являются.

список символов, которые вы можете использовать внутри ваши идентификаторы (а не только в начале) это много веселее:

for (int i = Character.MIN_CODE_POINT; i <= Character.MAX_CODE_POINT; i++)
    if (Character.isJavaIdentifierPart(i) && !Character.isAlphabetic(i))
        System.out.print((char) i + " ");

список:

I wanted to post the output, but it's forbidden by the SO spam filter. That's how fun it is!

Он включает в себя большинство символов! Я имею в виду колокола и дерьмо! Вы можете заставить свой исходный код звонить в колокол fn! Или используйте символы, которые будут отображаться только иногда, например мягкий дефис.