首页 > 其他分享 >ASCII 与 Unicode 中的引号

ASCII 与 Unicode 中的引号

时间:2024-12-12 09:22:33浏览次数:4  
标签:引号 0x27 ISO Unicode ASCII 0x60

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

摘要

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

背景

在 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 单引号 '

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

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

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

作为相互对称的形状。

问题

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

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

这些形状甚至得到了 ISO 646 标准(ANSI X3.4,也称为 ASCII)的早期美国版本的认可,该标准将 0x27 定义为 “单引号“ (结束尖音符号单引号 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 单引号 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 映射到正确的字形。

参考资料

标签:引号,0x27,ISO,Unicode,ASCII,0x60
From: https://www.cnblogs.com/haogj/p/18599736

相关文章

  • ### 最大化相邻字符ASCII码之差的最小值:C语言实现与详解
    在字符串处理问题中,如何调整字符的排列以最大化相邻字符ASCII码之差的最小值是一个有趣的挑战。本文将通过一个具体的C语言实现,带你了解这一问题的解决思路和代码细节。####问题描述给定一个字符串,通过调整其字符顺序,使得字符串中任意相邻字符ASCII码之差的最小值最大。###......
  • UNICODE编码特殊符号
    平时编程中会用到各种各样的符号,有时不想去找图片,一些简单的符号,可以直接通过Unicode字符来获取: RoundButton{text:"\u2713"//UnicodeCharacter'CHECKMARK'onClicked:textArea.readOnly=true}以下是常用的Unicode特殊符号,建议收藏:⇠  箭头......
  • html标签的属性值是否可以省略引号?为什么?
    HTML标签的属性值在某些情况下可以省略引号,但在某些情况下则必须使用引号。省略引号的规则比较微妙,最佳实践是始终使用引号,以避免潜在的问题并提高代码的可读性和可维护性。以下是详细解释:何时可以省略引号:属性值只包含字母、数字、连字符(-)和句点(.)等字符时:例如<inputtyp......
  • 写一个汉字与Unicode码的互转的方法
    /***汉字与Unicode码互转*/constunicodeConverter={/***汉字转Unicode码*@param{string}chineseString汉字字符串*@returns{string}Unicode码字符串,例如:\u4f60\u597d*/toUnicode(chineseString){letunicodeString='';for(......
  • Shell编程 - 引号篇
    双引号、单引号、不加引号与反引号在变量赋值时,如果值有空格,Shell会把空格后面的字符串解释为命令:#VAR=123-bash:2:commandnotfound#VAR="123"#echo$VAR123#VAR='123'#echo$VAR123看不出什么区别,再举个说明:#N=3#VAR="12$N"#echo$VAR12......
  • 2024年11月27日 比较字符的ASCII码值
    浅浅的随笔`#define_CRT_SECURE_NO_WARNINGS1//创建一个字符chara[10]//键盘输入十个字母并输出//找出ASCII最大值和最小值的字母//对数组进行排序(降序)#include<stdio.h>#defineN10intmain(){ chararr[N]={0};//创建数组 inti=0; printf("输入10个字......
  • ANSI 与 ASCII 的区别,编码老问题
    ANSI与ASCII的区别ANSI与ASCII在字符编码领域有着显著的区别,以下是对这两者的详细比较:ASCII全称与定义:ASCII全称AmericanStandardCodeforInformationInterchange,即美国信息交换标准代码。它是一种标准的单字节字符编码方案,主要用于显示现代英语和其他西欧语言。编码......
  • python 包含有引号和花括号的字符串的格式化
    replace不起作用;update_per_seconds="30"uploadtime_per_seconds="30"imei_string="1234"###采用{0}format不行###下面replace不行msg="""{"rmtcmd":"set","dev":{"poll":{&......
  • 【CTF Web】BUUCTF SQLi-LABS Page-1(Basic Challenges) Less-12 Writeup(SQL注入+POST
    sqli-labs1点击启动靶机。SQLi-LABSPage-1(BasicChallenges)解法随便提交一些数据。审查元素。<formaction=""name="form1"method="post"> <divstyle="margin-top:15px;height:30px;">Username:&nbsp;&nbsp;&......
  • 字符编码发展史4 — Unicode与UTF-8
    上一篇《字符编码发展史3—GB2312/Big5/GBK/GB18030》我们讲解了ANSI编码中的GB2312/Big5/GBK/GB18030。本篇我们将继续讲解字符编码的第三个发展阶段中的Unicode与UTF-8。2.3.第三个阶段国际化前面提到的第二个阶段,各个国家和地区各自为政,纷纷制定了适用于自己国家语言的字......