为什么 VIM 显示 Unicode 代码点而不是 UTF-8 代码值?

dot*_*hen 9 encoding vim unicode utf-8

考虑一下我在 PHP 博客中找到的这行假定的代码,注意引号:

throw new Exception(“That's not a server name!”);
Run Code Online (Sandbox Code Playgroud)

这些引号是正确的双引号(Unicode 代码点:U+201D;UTF-8 十六进制编码值:)0xE2 0x80 0x9Dga在 VIM 中按在状态栏中显示以下内容:

<”> 8221, Hex 201d, Octal 20035
Run Code Online (Sandbox Code Playgroud)

?

为什么显示的是 Unicode 代码点而不是 UTF-8 代码值?

考虑到文件存储为 UTF-8 并且它是将字节转换为字形的终端,我希望 VIM 显示文件的原始值(UTF-8 代码值),而不是将其转换为 Unicode 代码点.

rom*_*inl 17

为什么显示的是 Unicode 代码点而不是 UTF-8 代码值?

因为你使用ga

<”> 8221, Hex 201d, Octal 20035
Run Code Online (Sandbox Code Playgroud)

而不是g8

e2 80 9d
Run Code Online (Sandbox Code Playgroud)


use*_*686 13

因为 Vim 是一个文本编辑器,可以处理文本代码点,而不是字节。不止一种翻译发生——当打开一个文件时,编辑器必须将它从字节编码解码为内部表示(通常是 Unicode);当保存回文件或在终端上显示其内容时,编辑器必须将文本编码回字节。

原因之一很简单——文件和终端可能使用不同的字符集。例如,您正在编辑 ISO 8859-13 或 KOI8-R 中的一些旧文档,并希望它们在 UTF-8 终端上正确显示。

第二个原因再次是文本编辑器处理文本。例如,是一个字符,其宽度是一个终端单元格,无论其字节编码如何(UTF-8 中为 3 个字节,Windows-1257 中为 1 个字节,Shift-JIS 中为 2 个字节,等等)。如果 Vim 仅将其计为 3 个字节而终端将其显示为 1 个,则会导致垂直拆分未对齐、换行过早、制表符显得太窄等等。

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“. ?
?????????????????????????????     ?????????????????????????????
Run Code Online (Sandbox Code Playgroud)

更不用说,您必须Backspace 三遍才能删除单个字符。