Почему VIM показывает кодовую точку Unicode, а не кодовое значение UTF-8?
Рассмотрите эту предполагаемую строку кода, которую я нашел в блоге PHP, обратите внимание на кавычки:
throw new Exception(“That's not a server name!”);
Эти кавычки являются ПРАВИЛЬНЫМИ ДВОЙНЫМИ КВАРТИРАМИ U+201D
; UTF-8 шестнадцатеричное значение: 0xE2 0x80 0x9D
). При нажатии ga в VIM в строке состояния отображается следующее:
<”> 8221, Hex 201d, Octal 20035
Почему отображается кодовая точка Unicode, а не кодовое значение UTF-8?
Учитывая, что файл хранится как UTF-8 и является терминалом, переводящим байты в глифы, я ожидал бы, что VIM покажет необработанное значение файла (кодовое значение UTF-8), а не переведет его в кодовую точку Unicode,
2 ответа
Почему отображается кодовая точка Unicode, а не кодовое значение UTF-8?
Потому что вы используете ga
:
<”> 8221, Hex 201d, Octal 20035
вместо g8
:
e2 80 9d
Потому что Vim является текстовым редактором и работает с текстовыми кодовыми точками, а не байтами. Происходит более одного перевода - при открытии файла редактор должен декодировать его из байтовой кодировки во внутреннее представление (обычно Unicode); при сохранении обратно в файл или при отображении его содержимого на терминале редактор должен закодировать текст обратно в байты.
Одна из причин этого проста - файл и терминал могут использовать разные наборы символов. Например, вы редактируете некоторые старые документы в ISO 8859-13 или KOI8-R и хотите, чтобы они правильно отображались на терминале UTF-8.
Вторая причина, опять же, заключается в том, что текстовые редакторы работают с текстом. Например, ”
это один символ, а его ширина равна одной терминальной ячейке, независимо от ее байтовой кодировки (3 байта в UTF-8, 1 байт в Windows-1257, 2 байта в Shift-JIS и т. д.). Если Vim просто посчитал его как три байта, но терминал показал его как один, это привело бы к смещению вертикальных разбиений, слишком раннему переносу строк, появлению слишком узких вкладок и так далее.
Instead of this... ...you would see this.
┌───────────────────────────┐ ┌───────────────────────────┐
│She said, "Hello." │ │She said, "Hello." │
│ │ │ │
│She said, “Hello.” │ │She said, “Hello.” │
│ │ │ │
│Ji pasakė, „Sveiki“. │ │Ji pasakė, „Sveiki“. │
└───────────────────────────┘ └───────────────────────────┘
Не говоря уже о том, что вам придется трижды нажимать клавишу Backspace, чтобы удалить один символ.