unicode - 是否有诸如智能引号和总是中断的破折号之类的字符的类别或名称?

标签 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 dashes”?

最佳答案

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

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

有一个名为 QMark 的 Unicode 属性(简称),或 Quotation_Mark (长名称),包括 29 个引用样式代码点(UTF8,十六进制):0x0022, 0x0027, 0x00ab, 0x00bb, 0x2018, 0x2019, 0x201a, 0x201b, 0x201b, 0x201c,0x201,0x201,0x201,0x201,0x201,0x201 0x300d、0x300e、0x300f、0x301d、0x301e、0x301f、0xfe41、0xfe42、0xfe43、0xfe44、0xff02、0xff07、0xff66、0xff62

这是它们的外观(假设您的字体都支持它们):
"'«»‘’‚‛“”„‟‹›「」『』〝〞〟﹁﹂﹃﹄"'「」
恰好有一个 Unicode 属性 ASCII ,其中包含 0 到 127 之间的 128 个代码点也就不足为奇了。

我似乎找不到一个 Unicode 属性来指定“所有不是 ASCII 的东西”,但是您会知道它是因为它不在 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_Punctuation有 23 个代码点。请注意,许多代码点可以通过多个 Unicode 属性进行分类,因此 Hyphen 之间可能存在重叠。和 Dash ,并且可能在 Dash 之间有更多的重叠和 Dash_Punctuation ——我不知道也没有查过。

我知道这无论如何都不是以 Perl 为中心的问题,但我发现 Perl 在这里有很好的 Unicode 属性文档:perldoc perluniprops .

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

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

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

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

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

尽管它已经存在四年了,但这个特性(从 Perl 5.28 开始)仍然被标记为“实验性”。因此,要使用它,您应该在使用它的范围内添加以下编译指示:
no warnings qw(experimental::regex_sets);

这将消除实验警告。看到在不久的将来发布的 Perl 中解除了该警告,我不会感到惊讶。

关于unicode - 是否有诸如智能引号和总是中断的破折号之类的字符的类别或名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11379928/

相关文章:

需要 C++ Unicode 加密库(或者是?)

python - MySQLdb/Python : Can't insert certain characters in the db

javascript - 如何将大型 UTF-8 字符串转换为 ASCII?

java - 将 int char 转换为 int 而不改变 java 中的值

Python ASCII 加密程序

Python3 将字符串转换为字节

python - 在 python 中使用编解码器 utf-8 文件打开错误

windows - 将可能包含非 ASCII Unicode 字符的 PowerShell 输出解码为 Python 字符串

java - 如何将十六进制的 UTF-8 转换为其代码点?

Python-在二进制文件中写入长串位