冠军

导航

ASCII 与 Unicode 中的引号

原文地址:https://www.cl.cam.ac.uk/~mgk25/ucs/quotes.html

摘要

请不要使用 ASCII 中的重音符号 ` (0x60) 作为左边与 ASCII 中的撇号 Apostrophe ' (0x27) 作为右边一起使用。就像这样 ( `quote' )。否则,使用大多数现代字体(例如,在 Windows 和 Mac 系统上),您的文本会显得相当奇怪。只有旧的 X Window System 字体和一些旧的视频终端将 ASCII 0x60/0x27 显示为左引号和右引号,而大多数现代系统都遵循 ISO 和 Unicode 标准。如果只能使用 ASCII 的打字机字符,则使用撇号 Apostrophe ' (0x27) 作为左引号和右引号( 'quote' )。如果可以使用 Unicode 字符,则可以以字符 U+2018、U+2019、U+201C 和 U+201D 的形式使用漂亮的有方向的单/双引号 ( ‘quote’ or “quote” )。

撇号(全';半')(英语:apostrophe),是一种标点符号,用于多种语言的隔音、略音、缩写、所有格以及复数。撇号依不同用法而有许多异名,如:上标点、略缩号、隔音号、省字号、省年号、高撇号或缩写号。
在计算机领域撇号主要有两个字符,最初在ascii中的撇号“'”(U+0027 APOSTROPHE)和最初设计是用于右单引号的“’”(U+2019 RIGHT SINGLE QUOTATION MARK),但具体用途并无统一的规格。在英语印刷中更倾向于使用“’”(U+2019),而网络上更多人使用“'”(U+0027),因为一般的键盘上并无“’” (U+2019)[1]。

See: https://www.wikiwand.com/zh-cn/articles/撇号

背景

在 Unicode 和相应的 ISO 10646 标准中定义了如下的字符。

字符编码 含义 字符 说明
U+0022 引号 QUOTATION MARK " 中性(垂直),用作左引号或右引号; 成对引号的首选英文字符是 U+201C 和 U+201D
U+0027 撇号 APOSTROPHE ' 混合使用的中性(垂直)字形; 单引号的首选字符是 U+2018/U+2019
U+0060 重音符号 GRAVE ACCENT `
U+00B4 尖音符号 ACUTE ACCENT ´
U+2018 左单引号 LEFT SINGLE QUOTATION MARK
U+2019 右单引号 RIGHT SINGLE QUOTATION MARK 这是用于撇号的首选字符
U+201C 左双引号 LEFT DOUBLE QUOTATION MARK
U+201D 右双引号 RIGHT DOUBLE QUOTATION MARK

ASCII 和 ISO 8859 仅用于支持打字机用户可用的非常受限的排版样式。

下面的这两个 ASCII 字符

字符编码 含义 字符
0x22 双引号 "
0x27 撇号 Apostrophe '

应该表示打字机上常用的中性(垂直)字形。它们不应用作有方向的引号。

ISO 8859 和 Unicode 字体应该下面的两个重音字符

字符编码 含义 字符
0x60 重音符号 `
0xB4 尖音符号 ´

作为相互对称的形状。

问题

遗憾的是,X Window System 字体在很长一段时间内都包含以下相互对称的字形:

字符编码 含义 字符
0x27 撇号 Apostrophe
0x60 重音符号

这些形状甚至得到了 ISO 646 标准(ANSI X3.4,也称为 ASCII)的早期美国版本的认可,该标准将 0x27 定义为 “撇号 Apostrophe“ (结束尖音符号单引号 0x60),但当字体扩展到涵盖 ISO 8859-1 时,它们应该已经被更改了,这在 0xB4 处添加了单独的尖音符号。显然,不能同时将 0x27/0x60 和 0x60/0xB4 作为相互对称的字符形对,同时 0x27 和 0xB4 具有不同的形状。由于 0x60/0xB4 被现代标准定义为重音符号,因此它们的对称形状得到了优先权,只是直到 2004 年才在 X 字体中修复这一点(在 XFree86 附带的版本中稍早一些)。

旧的 X 字体鼓励一些 Unix 软件和文档的作者将 0x60 与 0x27 一起用作方向引号。这种做法看起来有点可以接受,比如

‛quotation’

如果用旧的 X 字体显示,但它看起来相当丑陋,就像

`quotation'

在大多数其他现代显示环境中(例如,使用正确设计的 Windows 和 Mac TrueType 字体,但也在许多经典的 1970 年代/1980 年代视频终端上,例如 Siemens/Nixdorf 和许多其他制造商的视频终端)。

例如,0x60 和 0x27 在 Windows NT 4.0 下使用 TrueType 字体 Lucida Console(大小 14)查看,如下所示:

Unicode 和 ISO 10646 对无方向的打字机样式的 ASCII 单引号与 撇号 Apostrophe U+0027 进行了非常明确的区分,如下所示

'quotation'

以及排版有方向引号 U+2018 和 U+2019,如

‘quotation’

Unicode 2.1 明确表示 U+2019 是首选的标点符号撇号,如 “We've been here before”。Unicode 标准还指出:

“由于历史原因,U+0027 是一个特别超负荷的角色。在 ASCII 中,它用于表示标点符号(例如右单引号、左单引号、撇号标点符号、竖线或素数)或修饰字母(例如撇号修饰符或重音符号)。(标点符号通常会断开单词;修饰符字母通常被视为单词的一部分。在许多系统中,它总是表示为一条垂直的直线,而永远不能表示弯撇号或右引号。

该怎么办?

如果您是某些 Unix 软件的作者,请检查您是否使用 ASCII 字符 0x60 (' ) 作为左引号,就像 'quote' 中一样。修改它,改为在两边都使用 0x27 (' ) 字符,就像 'quote' 一样。如果你在一个 UTF-8 编码已经无处不在的环境中工作(例如,Plan9 和大多数现代 GNU/Linux 安装),你甚至可以决定使用适当的方向引号,如 'quote' “quote”

使用

grep ' *
找出需要修改的地方。然后(小心翼翼地)使用类似

perl -pi.bak -e “s/'/'/g;” 文件1 文件2 ...
以自动进行必要的替换,或改为手动进行编辑。

在 Unix shell 中(表示命令替换,如 'command' 或更好的 $(command))、在 Perl、Lisp 或 TeX/troff 中(表示正确的左单引号)中使用 0x60(重音符)作为特殊控制字符不必更改,并且不受影响。Donald Knuth 的 TeXbook(第 2 章,第 3 页,第二段结束)实际上从 1986 年开始就已经警告 TeX 用户,撇号和重音符形状可以按照 ISO 和 Unicode 的要求显示,而不是在 TeXbook 的其余部分使用。Unix m4 宏处理器可能是唯一一个广泛使用的工具,它使用 'quote' 组合作为其输入语法的一部分;但是,即使这样也可以通过 changequote 进行修改。

为什么我们应该修复它?

有很多原因,为什么必须修复旧的 X 字体,以及随之而来的 ASCII 反引号做法:

  • 显然,重音符和重音符必须是相互对称的,这在旧的 X 字体中并非如此。
  • Unicode 4.0 标准明确规定 U+0027 是“具有混合用法的中性(垂直)字形”,并像这样显示整个 ASCII 部分:

  • ISO 10646、ISO 8859 和 ISO 646/ECMA-6 标准也显示了 U+0027 的竖排打字机撇号,并将 U+0060 和 U+00B4 作为互对称的重音符号。
  • ANSI X3.4:1986 (“ASCII”) 中的代码表使用 OCR-B 字体打印,也显示了垂直打字机撇号。从历史上看,最初提议在国际 7 位编码字符集中使用 0x60 是作为重音符号(ISO TC 97/SC 2 会议,1963 年 10 月 29 日至 31 日),直到后来在美国实施该标准时,其含义才得到扩展,也包括作为左单引号的使用(CACM 8(4)207-214, 1965).
  • 大多数欧洲键盘都有撇号和两种重音符号的键帽标签。这些标准一直类似于 ISO 和 Unicode 标准。下图显示了标准德国 PC 键盘上突出显示的相关键,该键盘左侧是尖音/重音键,退格键下方是数字符号/撇号键:

如果字体中的键帽标签和字形形状不一致,则可能会给用户带来相当大的混淆,就像在旧的 X 字体中一样。

  • Microsoft 和 Apple 字体也遵循现代标准,与旧的 X 字体不同。X11 用户真的不应该误导他们使用的字符在其他符合标准的系统上如何显示。否则,他们不会意识到,例如,Windows Web 浏览器(屏幕截图:Internet Explorer 5)的每个用户都会看到“反引号”,如下所示

  • 自从 XFree86 4.0 添加了 TrueType 字体支持以来,GNU/Linux 系统的用户越来越多地使用带有直0x27字形的现代字体,并且在试图用 ASCII 显示方向引号的旧软件(最明显的是各种 GNU 包)中得到有趣的引号。
  • 字符 0x27(撇号)和 0x22(引号)通常用于缩写分钟和秒或英尺和英寸,这也是为什么 0x27 应该只是 0x22 的单笔画版本,而不是卷曲的定向引号的另一个原因。

更新的 X Window System 核心 BDF 字体自 1998 年以来一直可用,其中的撇号和重音符现在已得到纠正,以及许多其他错误。它们从 4.0 版开始替换了 XFree86 中的旧字体,从 X11R6.8 开始替换了 X.Org 示例实现中的旧字体。

相关资料

PostScript

PostScript 在如何将 ASCII 字节映射到字形方面有着一段比较复杂的历史。在 PostScript 字体中,每个字形不是由代码位置标识的,而是由字形名称(如 “quotesingle”)标识的。Unicode 标准发布后,Adobe 发布了正式的 PostScript 字形名称到 Unicode 映射表。当 PostScript 解释器显示文本时,它使用编码向量将文本字符串中找到的 8 位字节值映射到字体中找到的字形名称。

Unicode glyph image PostScript
glyph name encoding vector
position name Std ISOLatin1 CE
U+0022 引号 " quotedbl 0x22 0x22 0x22
U+0027 撇号 ' quotesingle 0xA9 - 0x27
U+0060 重音符号 ` grave 0xC1 0x91 0x60
U+00B4 尖音符号 ´ acute 0xC2 0x92/0xB4 0xB4
U+2018 左单引号 quoteleft 0x60 0x60 0x91
U+2019 右单引号 quoteright 0x27 0x27 0x92
U+201C 左双引号 quotedblleft 0xAA - 0x93
U+201D 右双引号 quotedblright 0xBA - 0x94

PostScript 提供了几个预定义的 8 位编码向量。打印机驱动程序的作者可以轻松添加自己的驱动程序。如上表所示,最初的 PostScript 标准编码遵循类似于旧 X 字体的做法,但存在所有问题,即将 ASCII 字节0x60和0x27映射到弯引号和右引号(PostScript 字形名称术语中的“quoteleft”和“quoteright”,或 Unicode 中的 U+2018 和 U+2019)。

当 ISO 8859-1 出现时,Adobe 向 PostScript 添加了另一个名为 ISOLatin1Encoding 的预定义编码向量。这本来是与 ISO 8859-1 兼容的,但它仍然保持0x60,并且与旧的 StandardEncoding 向量0x27没有变化,因此它实际上并没有正确地打印 ISO 8859-1 字符0x27和0x60,这些字符对应于 Unicode 字符 U+0027 和 U+0060,应该用 PostScript 字形“grave”和“quotesingle”表示。Adobe 的 PostScript 语言参考,第三版(Addison-Wesley,ISBN 0-201-37922-8)的作者在第 783 页的 E.5 脚注 3 中承认了这一点,他们指出“ISOLatin1Encoding 编码向量偏离了 ISO 8859-1 标准”,并且想要“完全符合 ISO 标准”的应用程序应该创建一个修改后的编码向量。较新的 CE 编码向量(中欧,与 Windows CP1250 匹配)现在也在 PostScript 语言参考中进行了介绍,它正确地将 0x27 映射到 “quotesingle”,将 0x60 映射到 “grave”。

如果您编写 PostScript 驱动程序,请使用官方的 Unicode 到 PostScript 映射表将 ASCII、ISO 8859 和 ISO 10646 字符映射到 PostScript 字形,就像 XFree86 4.0 中更新的 Type 1 渲染器一样。请勿使用 ISOLatin1Encoding 编码向量来打印 ISO 8859-1 文本,除非先更改它以将 0x27 映射到 “quotesingle” 并将 0x60 映射到 “grave”。(此外,您可能还希望将 0x2D = HYPHEN-MINUS 映射到 PostScript 字形“连字符”,而不是 ISOLatin1Encoding 使用的“减号”映射)。

TeX

TeX 的 Computer Modern 系列中的字体 cmtt10 遵循 PostScript 标准编码的示例,在 ASCII 位置 0x22、0x60 和 0x27 上提供直双引号和定向单引号。它还分别在代码位置 0x0d、0x12 和 0x13 上提供直单引号、重音符和重音符号,但缺少定向双引号:

因此,为了演示在用 LaTeX 编写的文档中滥用 ASCII 的直引号和图形重音符号作为方向引号的结果,你可以写 texttt{char“12 quotechar”0D}。Computer Modern 中的非打字机字体没有单直引号和双直引号。

使用 LaTeX 的 upquote 包 (usepackage{upquote}) 以逐字模式将 ASCII 字符 0x27 和 0x60 映射到正确的字形。

参考资料

posted on 2024-12-12 09:14  冠军  阅读(26)  评论(0编辑  收藏  举报