我有一个包含 EM Dash 的 ASCII 文件(或者 — 在 HTML 中)。十六进制值为 0x97。当我们通过一个应用程序传递此文件时,它以 UTF-8 形式到达,并将字符转换为 0xC297,即 — 在 HTML 中。但是,当我们通过不同的应用程序传递此文件时,它会将字符转换为 0xE28094 或 —.

什么会导致这些应用程序以不同的方式转换这些字符?这可能是代码页设置吗?

有帮助吗?

解决方案

&安培;#151;是错的。使用数字字符引用时,该数字指的是Unicode代码点。对于低于256的数字,与ISO-8859-1中的代码点相同。在8859-1中,字符151属于“ C1控制代码”,而不是破折号或任何其他可见字符。

出现混淆是因为字符151是Windows代码页1252(西欧)中的破折号。很多人认为cp1252与ISO-8859-1是一回事,但实际上并非如此:C1范围内的字符(128到159)是不同的。

第一个应用程序是读取你的“ ASCII”文件*为ISO-8859-1,但实际上它可能是cp1252,你需要一种方法来解决应用程序关于它所期望的编码。

(*:“ ASCII”如果文件中有顶部位设置字符,则用词不当。你可能意味着“ ANSI”,这实际上也是用词不当,但是一个停留在Windows世界中的文本意味着在当前系统默认代码页中编码的文本”。)

其他提示

  • — 不是破折号, ,您的文本被错误地从破折号翻译为该值。
  • — 是 em dash 的 HTML 十进制实体。具体来说,它引用代表长破折号的 Unicode 代码点 8212。
  • 如果您的文件包含长破折号,则它不是 ASCII。ASCII 字符仅编码为十进制范围 0 - 127,而破折号不是可以用 ASCII 编码表示的字符。如果您将破折号存储为 0x97(十进制为 151),则您可能有一个 ANSI 文本文件(又名 Windows 代码页 1252 (w-1252))。

您的第一个应用程序...
数据以 w-1252 编码的长破折号开始。在 w-1252 中,长破折号映射到十进制值 151(十六进制为 0x97,或二进制为 10010111)。

在某些时候,长破折号是由认为文件中的字节是 iso-8859-1 编码文本的代码处理的。当该代码将 0x97 解释为字符串/字符时 根据 iso-8859-1 编码将 0x97 映射到字符. 。在 iso-8859-1 中,0x97 映射到字符“保护区结束”。

接下来,代码认为是“保护区结束”控制字符的字符串被编码为 utf-8。 以 utf-8 编码的“保护区结束”是两字节序列:0xC2 0x97.

您的第二个应用程序...
文本文件被正确解释为 w-1252,因此 0x97 被识别为长破折号,它被正确编码为 utf-8 中的长破折号:0xE2 0x80 0x94。

是什么影响了这种行为
不确定您是否正在处理网络应用程序或什么,但无论它是什么,概念应该是相同的。我们在 Web 应用程序中遇到了相同的 0x97->0xC297 场景,人们将数据输入到表单中。我发现网页的字符集被声明为 iso8859-1,浏览器处理 w1252 字符的最佳方法是将它们作为 iso 字节一起发送,而不通知用户或服务器。服务器收到数据认为是iso并转换为utf-8,结果是0xC297。

基本上,每当应用程序接触文本时,它都需要被告知文本是如何编码的,否则它可能会回退到系统默认值。如果发生这种情况,您将面临数据损坏的风险。

根据HTML4规范的字符实体参考 ,emdash是— ( U + 2014 )。

ASCII文件不能包含字符0x97,因为ASCII字符集的范围仅为0x00到0x7F。因此,您的文件不是ASCII,而是一些其他单字节编码。例如,windows-1250编码的em-dash为0x97。

如果应用程序使用除用于创建文件的编码之外的其他编码解码文本文件,则任何高于0x7F的字符都将是错误的。

在unicode中,em-dash的字符代码为0x2014,或十进制为8212。

Unicode Character'EM DASH'(U + 2014)

在一个网页中,例如使用windows-1250作为编码,代码— 将呈现为em-dash:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>em-dash</title>
    <meta http-equiv="content-type" content="text/html; charset=windows-1250"/>
</head>
<body>
    <div>&#151;</div>
</body>
</html>
scroll top