我有一个包含EM破折号的ASCII文件(在HTML中是-或—
)。十六进制值为0x97。当我们通过一个应用程序传递此文件时,它以UTF-8格式到达,并将字符转换为0xC297,即HTML中的—
。但是,当我们通过另一个应用程序传递此文件时,它将字符转换为0xE28094或—
。
是什么导致这些应用程序不同地转换这些字符?也许是代码页设置?
最佳答案
—是错的。当您使用数字字符引用时,数字是指Unicode代码点。对于低于256的数字,与ISO-8859-1中的代码点相同。在8859-1中,字符151位于“C1控制代码”之中,而不是破折号或任何其他可见字符。
出现困惑的原因是,字符151在Windows代码页1252(西欧)中是破折号。许多人认为cp1252与ISO-8859-1是同一回事,但实际上并非如此:C1范围(128至159)中的字符不同。
第一个应用程序正在读取ISO-8859-1中的“ASCII”文件*,但实际上它可能是cp1252,并且您需要一种方法来提示应用程序所需的编码。
(*:如果文件中包含高位字符,则“ASCII”是不正确的名称。您可能是说“ANSI”,这实际上也是一个不正确的名称,但在Windows世界中一直被认为是“文本编码在当前系统默认代码页中”。)