总结

总结

我有一个用 ANSI 编码的文本:

ANSI 文本文件

当我尝试将其转换为 UTF-8(使用 Notepad++ 菜单编码 > UTF-8)时,我收到一些奇怪的字符:

UTF-8 文本文件

我以为 UTF-8 是 ANSI 的超集,以后就不会再遇到这样的问题了。有什么办法可以避免出现这些奇怪的字符吗?

答案1

总结

选择Convert to UTF-8而不是Encode in UTF-8


UTF-8不是A字符集,只是一个编码Unicode 版本。前 128 个字节值与 ASCII(以及大多数其他正常字符集)完全相同。但是,设置了高位(或 ⩾ 0x80)的字节扩展字符在 ASCII 中,而在 UTF-8 中,它们表示多字节序列

这就是上面的 0x93 或 0x94 的情况。如果你用 ANSI 打开文件,它将使用当前的 Windows 代码页,通常是Windows-1252 在美国和大多数西欧国家/地区,这是默认设置。在 Windows-1252 中,这些字节是“智能引号”(或具有不同开头和结尾形式的曲线引号),这在使用 MS Word 等富文本编辑器时经常看到。但是,如果您选择编码 > 以 UTF-8 编码那么文件将被视为已使用 UTF-8 编码。Encode in...菜单项用于告诉 Notepad++真实的如果显示的字符有误,请重新编码1。由于 0x93 和 0x94 本身就是格式错误的 UTF-8 多字节序列,因此它们在编辑器中保持原样

这意味着文件中没有任何异常。只是你选择了错误的工具。你需要单击Convert to UTF-8将整个输入字节序列转换为所选编码

记事本编码


你还对以下问题有些困惑美国国家标准ASCII。ANSI 不是定义的字符集,可以表示任何代码页,尽管它通常指Windows-1252. Windows-1252 是ISO-8859-1(又称 Latin-1)和 ISO-8859-1 是 Unicode 的前 256 个代码点。ASCII 是一个 7 位字符集,是几乎所有以 8 位或更多位编码的 ANSI 代码页的子集。它有时也被称为 ANSI,尽管不太正确

一般来说,主要角色集之间的关系如下

ASCII < ISO-8859-1 < Windows-1252
        ^
        Unicode

1之所以会发生这种不幸的情况,是因为文本文件中没有嵌入编码信息,我们只能猜测,但每次都不可能猜对,而且确实会出现问题,比如著名的布什隐瞒了事实bug。请参阅

由于历史原因,Windows 同时处理 ANSI 和 Unicode 文本文件。因此,为了区分它们,它必须使用字节顺序标记作为一种签名表示它是具有特定编码的文本文件。尽管名称如此,但它不是确实是为了“字节顺序”标记目的,正如 Unix 人一直声称的那样,但纯粹是一个签名。拥有签名实际上是一件好事,每个适当的二进制文件格式都有签名。如果没有 BOM 签名,则编码为 ANSI,否则为 Unicode。由于 Unix 现在总是使用 UTF-8,并且实际上不必处理多种文本编码,因此通常不会出现像在 Windows 上那样的问题

相关内容