繁体   English   中英

EM Dash #151 有什么区别? 和#8212;?

[英]What is the difference between EM Dash #151; and #8212;?

我有一个 ASCII 文件,其中包含一个 EM Dash(— 或 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)的字符是不同的。

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

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

  • — 不是 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 解释为字符串/字符时,它根据 iso-8859-1 编码将 0x97 映射到字符 在 iso-8859-1 中,0x97 映射到字符“保护区域结束”。

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

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

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

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

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

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

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

在 unicode 中,破折号的字符代码为 0x2014,或十进制的 8212。

Unicode 字符 'EM DASH' (U+2014)

例如,在使用 windows-1250 作为编码的 web 页面中,代码— 将呈现为 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>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM