是否存在类似智能引号等字符的类别或名称以及始终破坏的破折号?

时间:2012-07-08 01:06:59

标签: unicode utf-8 ascii smart-quotes

许多人可能经历过将Word中的某些文本复制到网站表单或其他内容,所有引号('),双引号(“)和破折号( - )都会出现乱码。我相信引号称为”智能引号“或”Typographer's Quotes“,但我不知道破折号的名称。是否有包含这些字符的类别?还有更多吗?

此类别的识别功能:可使用普通的qwerty键盘访问,并且在视觉上容易误认为其等效的ASCII。

这个问题似乎是在处理同样的问题:How do I convert Word smart quotes and em dashes in a string?另外,也许他们被称为“em破折号”?

1 个答案:

答案 0 :(得分:5)

至少有1,114,111个有效的Unicode代码点。我的美国标准键盘使那些介于1到127(基数10)之间的键盘相当容易访问。

当您冒险超出该范围时,您将开始进入旧式区域设置或更现代的UTF8(或其他Unicode)代码点。许多这些代码点都可以从世界某个地方的键盘轻松访问。但是,在您自己的家中或办公室中,您可以从键盘轻松访问这些110万的相当小的子集。

有一个名为QMark(短名称)的Unicode属性,或Quotation_Mark(长名称),包含29个引用样式代码点(UTF8,十六进制):0x0022,0x0027, 0x00ab,0x00bb,0x2018,0x2019,0x201a,0x201b,0x201c,0x201d,0x201e,0x201f,0x2039,0x203a,0x300c,0x300d,0x300e,0x300f,0x301d,0x301e,0x301f,0xfe41,0xfe42,0xfe43,0xfe44,0xff02,0xff07, 0xff62和0xff63。

以下是它们的外观(假设您的字体全部支持它们):

"'«»‘’‚‛“”„‟‹›「」『』〝〞〟﹁﹂﹃﹄"'「」

恰好有一个Unicode属性ASCII,毫不奇怪,它包含了0到127之间的128个代码点。

我似乎无法找到指定“不是ASCII的所有东西”的Unicode属性,但是你会因为它超出0 .. 127范围而知道它。

还有一个Hyphen Unicode属性,包含11个代码点:0x002d,0x00ad,0x058a,0x1806,0x2010,0x2011,0x2e17,0x30fb,0xfe63,0xff0d和0xff65。我不愿意将它们全部粘贴在这里,因为它们中至少有两个不会在我的终端中渲染。但是这里有:

-­֊᠆‐‑⸗・﹣-・

正如您所看到的,有些与其他人无法区分。当我在Perl 5.16中使用Hyphen属性时,我得到一个警告,即不推荐使用特定的Unicode属性。我不知道这是否仅适用于Perl,或者它是否适用于Unicode。

还有一个包含27个代码点的Dash属性。我想你明白了,所以我不会在这里列举它们。 ......以及另一个名为Dash_Punctuation的23个代码点。请注意,许多代码点可以按多个Unicode属性进行分类,因此HyphenDash之间可能存在重叠,Dash和{{1}之间可能会有更多重叠我不知道也没有检查过。

我知道这不是一个以Perl为中心的问题,但我发现Perl在这里有很好的Unicode属性文档:perldoc perluniprops

所以我猜这个问题的答案很简短,“还有更多吗?”是的,还有大约110万。

更新:关于这些讨厌的字符被调用的内容......您必须区分代码点和字形。代码点是Unicode实体的明确表示,而字形就是它的样子。不同的字体可以彼此不同地实现给定的字形。所以在一种字体中看起来相同的东西在另一种字体中可能看起来有点不同开始考虑Unicode代码点及其相关的全名具有语义含义,而字形是简单的图形(不可靠)表示。

更新2:在某些编程语言(特别是Perl,但可能是其他语言)中,您可以使用 set 逻辑创建自定义字符类。在Perl中,这些被称为Extended Bracketed Character Classes,并在Dash_Punctuation中进行了讨论。如果要匹配不在ASCII范围内的所有引号,可以使用此子表达式:

perldoc perlrecharclass

上面的子表达式创建了一个字符类,它匹配所有类似引号的标记,不包括那些来自ASCII范围的标记。这是Perl版本5.18中引入Perl的一项功能。鉴于此“更新2”于2019年添加,而Perl 5.18于2013年发布,该功能已推出大约四年。不幸的是,我没有发现它已经进入Perl之外的PCRE库。

虽然它已经存在了四年,但这个功能(从Perl 5.28开始)仍然标记为“实验性”。因此,要使用它,您应该在使用它的范围中添加以下编译指示:

(?[\p{QMark}-\p{ASCII}])

这会压制实验警告。在近期发布的Perl版本中,我不会感到惊讶。