考虑一下我在 PHP 博客中找到的这行代码,请注意引号:
throw new Exception(“That's not a server name!”);
这些引言是右双引号(Unicode 代码点:U+201D
;UTF-8 十六进制编码值:0xE2 0x80 0x9D
)。ga在 VIM 中按下会在状态栏中显示以下内容:
<”> 8221, Hex 201d, Octal 20035
为什么显示的是 Unicode 代码点而不是 UTF-8 代码值?
考虑到文件以 UTF-8 格式存储,并且它是终端将字节转换为字形,我希望 VIM 显示文件的原始值(UTF-8 代码值),而不是将其转换为 Unicode 代码点。
答案1
为什么显示的是 Unicode 代码点而不是 UTF-8 代码值?
因为你使用ga
:
<”> 8221, Hex 201d, Octal 20035
代替g8
:
e2 80 9d
答案2
因为 Vim 是一个文本编辑器并适用于文本代码点,不是字节。发生的转换不止一次——打开文件时,编辑器必须将其从字节编码解码为内部表示(通常是 Unicode);保存回文件时或在终端上显示其内容时,编辑器必须将文本编码回字节。
原因很简单——文件和终端可能正在使用不同的字符集。例如,您正在编辑一些 ISO 8859-13 或 KOI8-R 中的旧文档,并希望它们在 UTF-8 终端上正确显示。
第二个原因,同样是文本编辑器处理文本。例如,”
是一个字符,其宽度是一个终端单元格,无论其字节编码如何(UTF-8 中为 3 个字节,Windows-1257 中为 1 个字节,Shift-JIS 中为 2 个字节,等等)。如果 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 三次删除单个字符。