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

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

考虑一下我在 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 三次删除单个字符。

相关内容