原文地址: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 映射到正确的字形。

参考资料

ASCII 与 Unicode 中的引号的更多相关文章

  1. javascript正则中ASCII与unicode

    正则表达式中允许直接利用ASCII和Unicode编码来查找我们相应的字符串. ASCII: 下面是检索ASCII编码在x41-x7a范围内的所有匹配的字符串.(x41,x7a为十六进制) var s ...

  2. ASCII、Unicode、UTF-8以及Python3编码问题

    编码问题,其实的确是个很烦人的问题,一开始觉得不需要看,到后来出现问题,真的是抓狂, 而像我们这些刚刚涉及到这些问题的小白来说,更是无从下手,所以查阅资料,总结理解下各个概念以及Python3的编码问 ...

  3. ASCII、Unicode、UTF-8 字符串和编码

    字符编码 我们已经讲过了,字符串也是一种数据类型,但是,字符串比较特殊的是还有一个编码问题. 因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.最早的计算机在设计时采用8个比特 ...

  4. ascii、unicode、utf、gb等编码详解

    很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成不同的状态,以表示世界上的万物.他们看到8个开关状态是好的,于是他们把这称为"字节".再后来,他们又做了一些可以处理这 ...

  5. 字符编码笔记:ASCII,Unicode和UTF-8

    很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成不同的状态,以表示世界上的万物.他们看到8个开关状态是好的,于是他们把这称为"字节". 再后来,他们又做了一些可以处理 ...

  6. ASCII、Unicode、GBK和UTF-8字符编码的区别联系

    转自http://dengo.org/archives/901 很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成不同的状态,以表示世界上的万物.他们看到8个开关状态是好的,于是他们把这称 ...

  7. 字符编码(ASCII,Unicode和UTF-8) 和 大小端

    本文包括2部分内容:“ASCII,Unicode和UTF-8” 和 “Big Endian和Little Endian”. 第1部分 ASCII,Unicode和UTF-8 介绍 1. ASCII码 ...

  8. ASCII、Unicode、GBK和UTF-8字符编码的区别联系(转载)

    ASCII.Unicode.GBK和UTF-8字符编码的区别联系 转载自:http://dengo.org/archives/901 很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成不同 ...

  9. 中文在unicode中的编码范围

    以前写过一篇贴子是写中文在unicode中的编码范围 unicode中文范围,但写的不是很详细,今天再次研究了下unicode,并给出详细的unicode取值范围. 本次研究的unicode对象是un ...

  10. 字节的高低位知识,Ascii,GB2312,UNICODE等编码的关系与来历

    很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成不同的状态,以表示世界上的万物.他们看到8个开关状态是好的,于是他们把这称为"字节". 再后来,他们又做了一些可以处理 ...

随机推荐

  1. .Net 6 SignalR 实际业务开发中遇到的问题及解决办法

    一.SiganlR 使用的协议类型 1.websocket即时通讯协议 2.Server-Sent Events(SSE)服务器事件 3.longpolling 长轮询. 如果客户端开启协商,会按顺序 ...

  2. 【赵渝强老师】Weblogic域和域的组成

    一.什么是Weblogic WebLogic是美国Oracle公司出品的一个application server,确切的说是一个基于Java EE架构的中间件,WebLogic是用于开发.集成.部署和 ...

  3. 支付宝 APP登录 获取用户信息 PHP(转)

    转载自:https://blog.csdn.net/wang78699425/article/details/78666401 支付宝 APP登录 获取用户信息 PHP(转) 支付宝APP登录服务端流 ...

  4. PC软件开发新体验!用 Blazor Hybrid 打造简洁高效的视频处理工具

    前言 国庆假期各种活动比较多,直到上班才有时间来更新文章~ 不过这两天我还是做了个小玩意(Clipify),起因是想给之前开发来自己用的简单视频剪辑工具 QuickCutSharp 加个功能,不过这个 ...

  5. 聊聊 HTAP 的前世今生

    随着现代社会大型实时分析应用的逐渐流行,关系型数据库已经难以处理高并发的事务请求.商业层面上,当全球进入数字化时代,数字化技术渗透到各行各业,同时产生了海量数据,数据的存储和应用是企业决策的重要依据之 ...

  6. 两小时学会使用dubbo(直接API、spring、注解、springboot)

    最近上新的项目中需要用到dubbo,于是我决定温故知新,决定分享一下Dubbo在各种环境下的使用方式,本篇文章让你两小时就能学会使用dubbo 什么是Dubbo Dubbo是一个分布式.高性能.透明化 ...

  7. 集成InfluxDb, telegraf, Grafana, App Metrics以记录性能指标

    前情概要 刚好有半天得闲功夫, 从项目里面找个功能来水一篇文章. 上线的项目通常都是需要做性能数据收集工作的, 它好处就不想打字了. 业界有很多套方案, 工具[收费的, 免费的], 收集采用[拉取的, ...

  8. 你为什么不应该过度关注go语言的逃逸分析

    逃逸分析算是go语言的特色之一,编译器自动分析变量/内存应该分配在栈上还是堆上,程序员不需要主动关心这些事情,保证了内存安全的同时也减轻了程序员的负担. 然而这个"减轻负担"的特性 ...

  9. Nuxt.js 应用中的 pages:extend 事件钩子详解

    title: Nuxt.js 应用中的 pages:extend 事件钩子详解 date: 2024/10/25 updated: 2024/10/25 author: cmdragon excerp ...

  10. 鸿蒙NEXT应用上架与分发步骤详解

    大家好,我是 V 哥.今天的文章来聊一聊HarmonyOS NEXT应用上架.当你开发.调试完HarmonyOS应用/元服务,就可以前往AppGallery Connect申请上架,华为审核通过后,用 ...