【问题标题】:What is the difference between EM Dash #151; and #8212;?EM Dash #151 有什么区别?和#8212;?
【发布时间】:2010-10-12 11:56:18
【问题描述】:

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

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

【问题讨论】:

    标签: unicode utf-8 ascii


    【解决方案1】:

    —是错的。当您使用数字字符引用时,数字指的是 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 世界中一直存在的意思是“在当前系统默认代码页中编码的文本”。)

    【讨论】:

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

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

      在某些时候,破折号是由认为文件中的字节是 iso-8859-1 编码文本的代码处理的。当该代码将 0x97 解释为字符串/字符时,它是 mapped 0x97 to a character according to the iso-8859-1 encoding。在 iso-8859-1 中,0x97 映射到字符“保护区域结束”。

      接下来,代码认为是“保护区域结束”控制字符的字符串被编码为 utf-8。 "End of guarded area" encoded in utf-8 is the two-byte sequence: 0xC2 0x97.

      您的第二个应用...
      文本文件被正确解释为 w-1252,因此 0x97 被识别为 em dash,在 utf-8 中正确编码为 em dash: 0xE2 0x80 0x94。

      影响这种行为的因素
      不确定您是在处理网络应用程序还是什么,但无论它是什么概念都应该是相同的。在人们将数据输入表单的 Web 应用程序中,我们有相同的 0x97->0xC297 场景。我发现网页的字符集被声明为 iso8859-1,而浏览器处理 w1252 字符的最佳方法是将它们作为 iso 字节发送而不提醒用户或服务器。服务端收到数据认为是iso,转成utf-8,产生0xC297。

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

      【讨论】:

        【解决方案3】:

        根据 HTML4 规范的character entity reference,破折号是 — (U+2014)。

        【讨论】:

          【解决方案4】:

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

          如果应用程序使用用于创建文件的编码以外的其他编码对文本文件进行解码,则 0x7F 以上的任何字符都是错误的。

          在 unicode 中,破折号的字符代码为 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>
          

          【讨论】:

            猜你喜欢
            • 2017-05-14
            • 2011-01-24
            • 2014-09-22
            • 2010-12-28
            • 2013-03-19
            • 2015-12-15
            • 1970-01-01
            • 1970-01-01
            • 2016-12-08
            相关资源
            最近更新 更多