文本编辑器如何存储超过 1 个字节的数据?

How do text editors store data above 1 byte?

基本问题是,记事本(或其他基本文本编辑器)如何存储数据。我 运行 加入这个是因为我试图比较不同压缩技术的文件大小,并意识到有些地方不太对劲。

详细说明..

如果我保存一个包含以下内容的文本文件:

a

文件是1个字节。这个刚好是97,也就是0x61。

我创建了一个包含以下内容的文本文件:

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ

这是0-255,即0x00到0xFF的所有字符。 这个文件是 256 字节。每个字符 1 个字节。这对我来说很有意义。

然后我将下面的字符附加到上面的字符串的末尾。

上述字符串中未包含的字符。所有 8 位字符都已使用。这个字符是 8224,即 0x2020。一个 2 字节的字符。

然而,文件大小仅从 256 字节变为 257 字节。其实上面的字符自己保存只显示1个字节

我错过了什么?

编辑:请注意,在第二个文本块中,许多字符未显示在此处。

ANSI 编码(这种 8 位 Microsoft 特定编码)中,您将每个字符保存在一个字节(8 位)中。

ANSI也叫Windows-1252,或Windows Latin-1

你应该看看 ANSI table ANSI Character Codes Chart or Windows-1252

所以对于个字符,它的编码是134,字节0x86.

用一个字节来编码一个字符只是表面上有意义。如果你说英语还可以,如果你说中文或日语,那就太糟糕了。今天的 Unicode 定义了 110,187 个印刷符号,并且有空间增长到 110 万个。字节不是存储 Unicode 符号的好方法,因为它只能编码 256 个不同的值。

因此,文本编辑器在将文本存储到文件时必须始终编码 文本。需要编码才能将 110,187 个值映射到面向字节的存储介质上。如果你说中文,不可避免地每个字符需要超过 1 个字节。

常用的编码方案有很多很多。上个世纪流行的是 code pages,一种使用字符集的方案。一种特定于语言的映射,通过选择语言中可能需要的 256 个字符,尽其所能地使每个字符只需要 1 个字节的存储空间。日文、韩文和中文因为不得不使用多字节映射,其他语言使用 1。

代码页是一场巨大的灾难,程序无法正确读取以另一种语言的代码页编码的文本文件。当文本文件靠近创建它的机器时,它就起作用了,尤其是互联网打破了这种用法。日语特别容易出现这种灾难,因为它有多个通用代码页。结果称为 mojibake, the user looks at gibberish in the text editor. Unicode came around in 1992 to try solve this disaster. One new standard to replace all the other ones, tends to invoke another kind of disaster.

你遭受了那种灾难,特别是如果你使用记事本。 尝试 与过去 30 年创建的文本文件兼容的程序。 Google "bush hid the facts" 一个搞笑的故事。请注意当您使用“文件”>“另存为”时出现的对话框,该对话框有一个名为 "Encoding" 的额外组合框。默认为 ANSI,这是上个世纪的破旧名称,意思是 "code page"。正如您所发现的,该字符在您机器的默认代码页中确实只需要 1 个字节。取决于你住在哪里,在西欧和美洲是 1252。如果您使用十六进制查看器查看文件,您会得到 0x86。

鉴于该对话框为您提供了选择,您应该不再支持 ANSI 的 mojibake,始终支持 UTF-8。也许他们有一天会更新记事本,让它使用更好的默认值,很难做到。