文本编辑器如何将数据存储在1个字节以上?

时间:2016-05-17 04:53:07

标签: text unicode character ansi notepad

基本问题是,记事本(或其他基本文本编辑器)如何存储数据。我碰到了这个,因为我试图比较不同压缩技术的文件大小,并意识到某些东西不太正确。

详细说明..

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

a

该文件是1个字节。这个恰好是97或0x61。

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

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

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

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

上述字符串中未包含的字符。所有8位字符都已使用过。该字符为8224或0x2020。一个2字节的字符。

然而,文件大小仅从256更改为257字节。实际上,上面保存的字符本身只显示1个字节。

我错过了什么?

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

2 个答案:

答案 0 :(得分:4)

ANSI编码(此8位Microsoft特定编码)中,将每个字符保存为一个字节(8位)。

ANSI也称为Windows-1252Windows Latin-1

您应该查看ANSI Character Codes ChartWindows-1252中的ANSI

因此对于字符,其代码为134,字节为0x86

答案 1 :(得分:2)

使用一个字节对字符进行编码只对表面有意义。如果你说英语就行不错,这是一个公平的灾难,你会说中文或日文。今天的Unicode定义了110,187个印刷符号,可以增长到110万个。字节不是存储Unicode符号的好方法,因为它只能编码256个不同的值。

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

有许多常用的编码方案。上个世纪流行的是代码页,一种使用字符集的方案。一种特定于语言的映射,通过挑选语言中可能需要的256个字符,尽可能地尝试每个字符只需要1个字节的存储空间。日语,韩语和中文使用多字节映射,因为它们必须使用其他语言1.

代码页面是一个巨大的灾难,程序无法正确读取用另一种语言的代码页编码的文本文件。当文本文件靠近创建它的机器时,它起作用,特别是互联网打破了这种用法。日本人特别容易发生这场灾难,因为它有多个常用的代码页。结果称为mojibake,用户在文本编辑器中查看乱码。 Unicode于1992年出现,试图解决这场灾难。一个替换所有其他标准的新标准倾向于调用another kind of disaster

您遇到了这种灾难,特别是如果您使用记事本。 尝试与过去30年创建的文本文件兼容的程序。 Google&#34; bush隐藏了事实&#34;这是一个有趣的故事。请注意使用File&gt;时获得的对话框另存为,该对话框有一个额外的组合框标题为&#34;编码&#34;。默认值为ANSI,这是上个世纪的破碎名称,意思是&#34;代码页&#34;。正如您所发现的那样,该角色确实只需要在您机器的默认代码页中使用1个字节。取决于你居住的地方,在西欧和美洲是1252。如果用十六进制查看器查看文件,你将获得0x86。

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

相关问题