我有一个文本文件,其中包含一些中文字符,如打印机驱动程序安装磁盘。默认情况下,该文件采用 ANSI 代码集。如果我在 Textpad 编辑器中将其保存为 utf-8,则工作正常,二进制值正确,如果我打开保存的 utf-8 文件,则一切正常。但如果我使用 iconv 将原始文件转换为 utf-8,则二进制值与在 textpad 中保存的值不同,如果我打开转换后的文件,则会出现警告,提示字符在代码页 936 中不存在...这将转换为系统默认字符....
为什么在 textpad 中以 utf-8 格式保存文本文件和使用 iconv 转换文件之间存在这种差异?
答案1
美国国家标准
ANSI 字符集应该是指美国国家标准协会 (ANSI) 定义的字符集。然而 ANSI 已经定义了许多不同的字符集。
微软和其他公司有时错误地使用名称“ANSI”表示代码页 1252 (CP-1252),也称为 Windows-1252 或 Windows-Latin-1。此字符集不是 ANSI 定义的字符集之一。此字符集与 ISO-8859-1 类似,但有许多不同之处。对于这个问题最重要的是此字符集不包含任何中文字符。
CP936
“代码页 936 是 Microsoft 针对简体中文的字符编码,是东亚语言的四种 DBCS 之一。它最初与 GB 2312 相同,并随着 Windows 95 的发布而扩展为覆盖 GBK 的大部分内容;现在已被代码页 54936(GB 18030)取代。”——维基百科
图标
如果您要求 iconv 从 MS-ANSI 或 ISO-8859-1 转换为 UTF-8,它将无法将任何数据解释为中文字符,因为 MS-ANSI 或 ISO-8859-1 中不存在这样的字符。
您必须告诉 iconv 文本文件的真实编码。如果您的文本文件确实是以 CP936 编码的,并且 iconv 也被告知了这一点,那么我希望它能够正常工作。
文本板
微软
微软持续滥用 ANSI 的名称是可耻的,并且继续给客户带来极大的困惑和浪费时间和金钱。这个问题可能就说明了这一点。
微软说“用于表示 Windows 代码页的术语“ANSI”是一个历史参考,也是 Windows 社区中存在的一个错误名称。这个错误名称的来源是 Windows 代码页 1252 最初基于 ANSI 草案,该草案成为国际标准化组织 (ISO) 标准 8859-1 [ISO/IEC-8859-1]。在 Windows 中,ANSI 字符集可以是以下任何代码页:1252、1250、1251、1253、1254、1255、1256、1257、1258、874、932、936、949 或 950。”
请注意,该列表中包含了 CP-936。
不幸的是,microsoft.com 上的许多其他网页错误地使用了术语 ANSI。