Почему ASCII SUB (\ u001a) игнорируется в JAVA? - PullRequest
0 голосов
/ 27 апреля 2020

В Java Spe c я читал, что

В качестве особой уступки для совместимости с определенными операционными системами, символ ASCII SUB (\ u001a или control-Z) игнорируется, если это последний символ в экранированном входном потоке. Здесь

Я не понимаю, что такое символ SUB и почему его следует удалить / игнорировать , если это последний символ в экранированном входном потоке

Может кто-нибудь помочь мне понять. Большое спасибо

Ответы [ 2 ]

0 голосов
/ 27 апреля 2020

Управляющий код Ctrl + Z является своего рода особенным в Windows, который унаследовал его от DOS, который унаследовал его от CP / M. Его традиционное использование использовалось в качестве маркера конца текста, подобно тому, как Ctrl + D используется в Unix.

. Он был включен как непечатаемый символ в Юникоде, чтобы соответствовать существующему символу ASCII 0x1A. .

Многие текстовые редакторы и языки программирования по-прежнему поддерживают это соглашение или могут быть настроены на вставку этого символа в конец файла при редактировании. Стандартная спецификация для файлов CSV по-прежнему рекомендует добавлять конечный символ EOF в качестве последнего символа в файле.

См. https://en.wikipedia.org/wiki/Substitute_character

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

Таким образом, если вы поместите Ctrl-Z в середине вашего исходного кода, например, как часть имени переменной, вы получите ошибку компилятора. Но если вы напишите свой код в каком-нибудь древнем текстовом редакторе, который помещает Ctrl-Z в конец файла, компилятор безопасно проигнорирует его для вас.

0 голосов
/ 27 апреля 2020

Видимо ASCII SUB традиционно использовался в некоторых старых операционных системах для указания конца файла или конца символьного потока (то есть пользователя, закрывающего терминал).

Это однако это не то, что вы увидите в любой недавней системе. Вероятно, это правило, которое Java унаследовало от самого первого издания, где оно существовало как способ предотвращения бессмысленных и предотвратимых ошибок при компиляции исходного кода, написанного с учетом этого соглашения.

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

tl; dr Это устаревшее правило поддержки древних операционных систем, и его удаление сегодня вряд ли вызовет какие-либо серьезные проблемы.

...