【问题标题】:Why is Unicode Character 'DOUBLE LOW-9 QUOTATION MARK' (U+201E) not a quotation mark?为什么 Unicode 字符 'DOUBLE LOW-9 QUOTATION MARK' (U+201E) 不是引号?
【发布时间】:2020-09-23 11:11:34
【问题描述】:

尽管我偶然发现了这个问题,因为我编写的 PHP 正则表达式未能以我预期的方式匹配它,但我不确定这是否是正确的地方。毕竟,PHP 中的定义(可能还有其他支持 Unicode 的正则表达式引擎)似乎与官方分类相匹配(参见例如 https://www.fileformat.info/info/unicode/char/201e/index.htm),我对这个官方分类很不满意。

据此,DOUBLE LOW-9 QUOTATION MARK 被归类为Ps(因此与/\p{Ps}/ 匹配),尽管它的名字,但不是Pi(首引号),用于德语。它甚至没有进入不太具体的“标点符号,初始引用(可能表现得像PsPe,具体取决于用法)”类别。这种(错误)分类的原因可能是什么?在哪些语言中,它实际上用作Ps(即类似于"(""[""{")?

但最重要的是:什么是合适的正则表达式,它涵盖所有语言中的各种引号而不枚举太多单独的代码点?

【问题讨论】:

  • 如果你有一个像[\p{Pi}\x{201E}]这样的字符类设置,也许它会起作用?不确定Pi是否会缺少其他引号。
  • 此外,如果您想深入了解,可以在here 找到用作括号的任何此类引号的列表。快速扫描告诉我有几个属于PsPePf
  • 我的猜测是它被用作初始标点符号在德语中,但不一定在其他地方。也许它的用途太模糊而不能被普遍归类为一种或另一种。
  • @deceze Dutch 过去也使用了“,尽管我们似乎后来改用了”。
  • /[\x{FE41}-\x{FE44}\x{FF02}\x{FF07}\x{FF62}-\x{FF63}\x{2018}-\x{201F}\x{2039}-\x{203A}\x{300C}-\x{300F}\x{301D}-\x{301F}\x{2E42}\x{22}\x{27}\x{AB}\x{BB}]/u 涵盖所有代码点 Quotation_Mark = Y

标签: regex unicode


【解决方案1】:

一般类别Pi (Initial_Punctuation) 和Pf (Final_Punctuation) 并非专门用于引号,就像Ps (Open_Punctuation) 和Pe (Close_Punctuation)不是专门用于不是引号的字符。相反,PiPf 用于字符对,其中 任何一个 可以根据使用情况打开或关闭,而 Ps 字符总是打开和Pe 字符总是关闭(忽略罕见或特殊情况)。一个字符属于这些一般类别中的哪一个是基于这些考虑,与它是引号、括号还是其他无关。

U+201E DOUBLE LOW-9 QUOTATION MARK 被归类为Ps,因为世界上没有既定的正字法可以用作结束标记。它在实践中总是开放。相比之下,U+201C 左双引号被归类为Pi,因为它既可以是开头也可以是结尾引号,具体取决于您选择的特定引号样式。

Unicode 有一个专门的属性,用于识别适当地命名为Quotation_Mark 的引号。此属性的定义独立于前面讨论的一般类别值。

【讨论】:

  • 听起来很奇怪。 “这并不总是在end,它有时在start,所以我们最好称之为final”?? /rant -- 但对于应用程序来说更重要的是:似乎Quotation_mark 属性在常见的正则表达式引擎中不能用作速记?
猜你喜欢
  • 2021-11-05
  • 2013-06-06
  • 1970-01-01
  • 2017-06-10
  • 2021-09-14
  • 2015-08-20
  • 1970-01-01
  • 2022-01-18
  • 1970-01-01
相关资源
最近更新 更多