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

Mik*_*key 5 unicode ascii utf-8 smart-quotes

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

辨别此类别的功能:使用普通的qwerty键盘可访问,并且很容易在视觉上错误地使用其ASCII等效字符.

这个问题似乎正在处理同样的问题:如何在字符串中转换Word智能引号和em破折号? 也许,他们可能被称为"em破折号"?

Dav*_*idO 5

至少有1,114,111个有效的Unicode代码点。我的美国标准键盘使1到127(以10为底)之间的键盘相当容易使用。

当您冒险超出此范围时,您会开始进入旧的语言环境,或更现代的UTF8(或其他Unicode)代码点。这些代码点中的许多代码点都可以通过世界各地的键盘轻松访问。但是从舒适的家中或办公室中,您会发现这110万个中的一小部分可以通过键盘轻松访问。

有一个Unicode属性,称为QMark(短名称)或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,

它们的外观如下(假设您的字体支持所有字体):

"'«»‘’‚?“”„?‹›???????????????

碰巧有一个Unicode属性ASCII,不足为奇地包含0到127之间的128个代码点。

我似乎找不到指定“不是ASCII的所有内容”的Unicode属性,但是由于它不在0 .. 127范围内,您将知道它。

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

-­?????????

如您所见,有些与其他没有区别。当我Hyphen在Perl 5.16中使用该属性时,我收到警告,特定的Unicode属性已被弃用。我不知道这是仅用于Perl,还是通常用于Unicode。

还有一个Dash包含27个代码点的属性。我想您知道这个主意,因此在此不再赘述。...另一个以Dash_Punctuation23个代码点命名。需要注意的是很多代码点可以由一个以上的Unicode属性来分类,因此它可能是有重叠之间HyphenDash,甚至可能更多的重叠之间Dash以及Dash_Punctuation-我不知道,也没有检查。

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

因此,我想这个问题的简短答案是:“还有更多吗?” 是的,还有大约110万。

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

更新2:在某些编程语言(特别是Perl,但可能还有其他语言)中,您可以使用集合逻辑创建自定义字符类。在Perl中,这些被称为扩展括号字符类,在中进行了讨论perldoc perlrecharclass。如果要匹配不在ASCII范围内的所有引号,则可以使用以下子表达式:

(?[\p{QMark}-\p{ASCII}])
Run Code Online (Sandbox Code Playgroud)

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

尽管已经存在了四年,但此功能(自Perl 5.28起)仍标记为“实验性”。因此,要使用它,您应该在使用它的范围内添加以下编译指示:

no warnings qw(experimental::regex_sets);
Run Code Online (Sandbox Code Playgroud)

这将抑制实验性警告。看到不久以后发布的Perl解除了警告,我不会感到惊讶。