【问题标题】:How do text editors store data above 1 byte?文本编辑器如何存储 1 字节以上的数据?
【发布时间】:2016-05-17 04:53:06
【问题描述】:

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

详细说明..

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

a

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

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

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

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

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

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

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

我错过了什么?

编辑:请注意,在第二个文本块中,许多字符没有出现在这里。

【问题讨论】:

  • 你用什么来检查文件的大小?
  • @ChrisMartin Windows 资源管理器/文件属性
  • 无论您使用什么工具来报告大小,至少显然是以字符为单位报告大小。
  • @DavidSchwartz 我应该使用什么工具来查看文件大小?同样,我只是在使用基本的操作系统属性查看器。
  • 这取决于用于存储文件的字符集。一件重要的事情是,小于 32 的代码点是不可显示的,因为它们是控制代码,所以上面的文本不是 256 个字符。此外,Windows 程序在看到 0x1a 时可能会停止处理文本文件

标签: text unicode character ansi notepad


【解决方案1】:

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

ANSI 也称为 Windows-1252Windows Latin-1

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

所以对于字符,它的代码是134,字节0x86

【讨论】:

  • 并非所有 Ansi 编码都限制为每个字符 1 个字节。 某些编码例如Windows-1252Latin-1,但也有可用的多字节Ansi编码。
  • @RemyLebeau,你能给个参考吗?
  • 对多字节序列使用前导字节和尾随字节的任何 Ansi 编码,例如用于中文和日文的 DBCS 代码页。
【解决方案2】:

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

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

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

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

您会遭受这种灾难,尤其是在您使用记事本的情况下。 尝试与过去 30 年创建的文本文件兼容的程序。谷歌“布什隐瞒了事实”,这是一个有趣的故事。请注意使用“文件”>“另存为”时出现的对话框,该对话框有一个额外的组合框,标题为“编码”。默认值为 ANSI,这是上个世纪的一个残缺名称,意思是“代码页”。正如您所发现的,该字符在您机器的默认代码页中确实只需要 1 个字节。取决于你住在哪里,在西欧和美洲是1252。如果你用十六进制查看器查看文件,你会得到 0x86。

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

【讨论】:

    猜你喜欢
    • 2019-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-29
    • 2016-06-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多