Почему Java разрешает экранированные символы юникода в исходном коде?


Я недавно узнал что Юникод разрешен в исходном коде Java не только как символы Юникода (например. double π = Math.PI;), но и в виде экранированных последовательностей (например. double u03C0 = Math.PI;).

вот несколько фрагментов кода для иллюстрации использования, протестированных с помощью Java SE 6 и NetBeans 6.9.1:

этот код будет распечатан 3.141592653589793

public static void main(String[] args) {
    double π = Math.PI;
    System.out.println(u03C0);
}

пояснение: π и u03C0-это один и тот же символ Юникода

этот код ничего не распечатает

public static void main(String[] args) {
    double π = Math.PI; /u002A
    System.out.println(π);

    /* a comment */
}

пояснение: приведенный выше код фактически кодирует:

public static void main(String[] args) {
    double π = Math.PI; /*
    System.out.println(π);

    /* a comment */
}

который комментирует печать satement.

только из моих примеров я замечаю ряд потенциальных проблем с этим языком особенность.

во-вторых, там, кажется, не хватает поддержки среди IDE. Ни NetBeans, ни Eclipse не предоставили правильную подсветку кода для примеров. Фактически, NetBeans даже отметил синтаксическую ошибку (хотя компиляция не была проблема.)

наконец, эта функция плохо документирована и не является общепринятой. Зачем программисту использовать в своем коде то, что другие программисты не смогут распознать и понять? На самом деле, я даже не мог найти что-то об этом в вопросе скрытых функций Java.

мой вопрос такой:

почему Java позволяет использовать экранированные последовательности Юникода в синтаксисе? Каковы некоторые "плюсы" этой функции, которые позволили ей остаться часть Java, несмотря на ее многочисленные "минусы"?

4 61

4 ответа:

escape-последовательности Юникода позволяют хранить и передавать исходный код в чистом ASCII и по-прежнему использовать весь диапазон символов Юникода. Это имеет два преимущества:

  • нет риска того, что символы, отличные от ASCII, будут сломаны инструментами, которые не могут их обрабатывать. Это было реальной проблемой еще в начале 1990-х годов, когда Java был разработан. Отправка сообщения электронной почты, содержащего символы, отличные от ASCII, и его прибытие без путаницы было исключением, а не норма.

  • нет необходимости указывать компилятору и редактору / IDE, какую кодировку использовать для интерпретации исходного кода. Это все еще очень серьезная проблема. Конечно, гораздо лучшим решением было бы иметь кодировку в качестве метаданных в заголовке файла (как в XML), но тогда это еще не было лучшей практикой.

первый вариант имеет смысл для меня - это позволяет программистам называть переменные и методы в международный язык выбор. Тем не менее, я не вижу никаких практическое применение второго подход.

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

во-первых, плохой программист может использовать его чтобы тайно комментировать биты кода, или создать несколько способов определения та же переменная.

Если вы обеспокоены о программисте сознательно саботируя читаемость вашего кода, эта языковая функция является наименьшей из ваших проблем.

во-вторых, там, кажется, не хватает поддержки среди IDE.

Это вряд ли вина или дизайнеров. Но тогда я не думаю, что он когда-либо предназначался для использования "вручную". В идеале IDE будет иметь возможность вводить символы нормально и отображать их нормально, но автоматически сохранять их в виде escape-последовательности Юникода. Возможно, даже уже есть плагины или параметры конфигурации, которые заставляют IDE вести себя таким образом.

но в целом, эта функция кажется очень редко используется и, вероятно, поэтому плохо поддерживается. Но как люди, которые разрабатывали Java около 1993 года, могли это знать?

хорошая вещь о \u03C0 кодирование заключается в том, что он гораздо менее вероятно будет munged текстовым редактором с неправильными настройками кодирования. Например, ошибка в моем программном обеспечении была вызвана случайным преобразованием из UTF-8 é в macroman-принятой é С помощью неверно настроенного текстового редактора. Указав кодовую точку Unicode, вы совершенно однозначно понимаете, что имеете в виду.

синтаксис \uXXXX позволяет однозначно представлять символы Юникода в файле с кодировкой, не способной выражать их напрямую, или если вы хотите, чтобы представление гарантированно использовалось даже в самом низком общем знаменателе, а именно в 7-битной кодировке ASCII.

вы может представляют все ваши символы с \uXXXX, даже пробелы и буквы, но редко есть необходимость.

во-первых, спасибо за вопрос. Я думаю, что это очень интересно. Во-вторых, причина в том, что исходный файл java-это текст, который может использовать различные наборы символов. Например, кодировка по умолчанию в Eclipse Cp1255. Этот endoding не поддерживает символы, такие как π. Я думаю, что они думали о программистах, которые должны работать на системах, которые не поддерживают unicode, и хотели позволить этим программистам создавать программное обеспечение с поддержкой unicode. Это было причиной для поддержки нотации.