Почему 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, чтобы удалить один символ.

Другие вопросы по тегам