【问题标题】:Why does a 32-byte ASCII text file become 66-byte when converted to Unicode?为什么 32 字节的 ASCII 文本文件在转换为 Unicode 时会变成 66 字节?
【发布时间】:2019-02-23 01:43:46
【问题描述】:

在 Windows 记事本中创建并以 ASCII 格式保存的 32 个字符的文本文件的大小为 32 个字节。当相同的 32 个字符的文本以 Unicode 保存时,大小增加到 66 个字节。

为什么大小不是 64 字节,因为 16 位 Unicode 字符的大小是 ASCII 字符的两倍?

【问题讨论】:

  • @phuclv:OP说原始文件是ASCII,这意味着它是一个8位字节序列,每个字节的高位设置为0。这足以告诉我们使用 BOM 将其转换为 UTF-16 将产生一个 66 字节的文件。
  • 由于历史原因,Windows 上使用的一些常用术语搞砸了。 “ANSI”被错误地用来指代几个 8 位字符集中的任何一个,最常见的是 Windows-1252。 “ASCII”是一个 7 位字符集,几乎总是以 8 位字节存储。 “Unicode”被错误地用来指代 Unicode 的一种特定编码,即带有 BOM 的 UTF-16LE。在 Windows 之外,最常见的 Unicode 编码是 UTF-8(不需要 BOM)。
  • @KeithThompson Windows 使用 UTF-8 的 BOM 将它们与“ANSI”文件区分开来。这不是为了字节顺序标记的目的,因为很多人总是抱怨
  • 记事本支持使用系统默认代码页utf8或utf16保存文本文件。 utf16 文件的大小通常是第一个文件的两倍,加上 U+FEFF 字节顺序标记 (BOM) 的 2 个额外字节。这就是任何其他应用程序可以看到它是用 utf16 编码的方式。

标签: file unicode ascii utf-16 notepad


【解决方案1】:

Unicode 只是一个字符集,没有 16 位字符,因为它不是一组不存储在任何地方的字符映射。为了表示 Unicode,有 UTF-8、UTF-16 和 UTF-32 以及许多其他具有不同代码单元大小的编码。 Unicode 不能仅用 16 位表示,因为它是 21 位字符集。

在不知道原始文件内容的情况下,如果它包含纯 ASCII(即只有低于 128 的代码点),那么这是因为 byte order mark (BOM) U+FEFF。当您在记事本中保存文件时选择“Unicode”,它实际上是 UTF-16LE,并且会在开头嵌入 2 字节 BOM (0xFF 0xFE) 以指示文件的编码,使其大小增加到 66。记事本只是令人困惑。事实上,如果你在 U+FFFF 下面输入任何文本并保存为 UTF-16,也会发生同样的事情。如果您将纯 ASCII 文件保存为 UTF-8,那么由于 3 字节 BOM,长度现在将为 35 字节

必读:The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)

【讨论】:

    猜你喜欢
    • 2018-08-28
    • 2013-05-10
    • 2021-02-27
    • 2015-07-26
    • 2011-09-23
    • 1970-01-01
    • 1970-01-01
    • 2012-11-14
    • 2013-08-17
    相关资源
    最近更新 更多