7

Рассмотрите эту предполагаемую строку кода, которую я нашел в блоге PHP, обратите внимание на кавычки:

throw new Exception(“That's not a server name!”);

Эти кавычки представляют собой ПРАВУЮ ДВОЙНУЮ КВАРТИРУЮЩУЮ КАРТУ (кодовая точка Unicode: U+201D ; шестнадцатеричное значение UTF-8: 0xE2 0x80 0x9D). При нажатии g a в VIM в строке состояния отображается следующее:

<”> 8221, Hex 201d, Octal 20035

Почему отображается кодовая точка Unicode, а не кодовое значение UTF-8?

Учитывая, что файл хранится как UTF-8 и является терминалом, переводящим байты в глифы, я ожидал бы, что VIM покажет необработанное значение файла (кодовое значение UTF-8), а не переведет его в кодовую точку Unicode ,

2 ответа2

16

Почему отображается кодовая точка Unicode, а не кодовое значение UTF-8?

Потому что вы используете ga:

<”> 8221, Hex 201d, Octal 20035

вместо g8:

e2 80 9d
13

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .