Ответ 1
Компилятор Java переводит \uxxxx
escape-последовательности как один из первых шагов, даже до того, как токенизатор получает трещину в коде. К тому времени, когда он фактически начинает токенизацию, больше нет \uxxxx
; они уже превращены в символы, которые они представляют, поэтому для компилятора ваш пример Java выглядит так же, как если бы вы каким-то образом набрали возврат каретки. Он делает это, чтобы обеспечить способ использования Unicode в источнике, независимо от кодировки исходного файла. Даже текст ASCII может по-прежнему полностью отображать символы Unicode, если это необходимо (за счет удобочитаемости), а так как это сделано так рано, вы можете получить их почти в любом месте кода. (Вы могли бы сказать \u0063\u006c\u0061\u0073\u0073\u0020\u0053\u0074\u0075\u0066\u0066\u0020\u007b\u007d
, и компилятор прочитал бы его как class Stuff {}
, если бы вы хотели раздражать или мучить себя.)
С# этого не делает. \uxxxx
переводится позже, с остальной частью программы, и действителен только в определенных типах токенов (а именно, для идентификаторов и литералов string/char). Это означает, что он не может использоваться в определенных местах, где он может использоваться на Java. cl\u0061ss
не является ключевым словом, например.