为什么一些 Unicode 组合标记(如 \u0BCD)与 Ruby 中的 [:alpha:] 不匹配?



我正在尝试在泰米尔语Unicode代码点上使用Ruby Regexp。u0BC0u0BCD都在Mark, Nonspacing [Mn]字符类别中组合元音标记,根据我的理解,这应该与[:alpha:]类相匹配。但u0BCD似乎与班级不匹配。

irb(main):002:0> "u0BAEu0BC0u0BA9u0BCDu0BA9".scan(/[[:alpha:]]+/).each { |s| puts s.dump }
"u0BAEu0BC0u0BA9"
"u0BA9"
=> ["மீன", "ன"]
irb(main):003:0> 

我在OS X 10.15.2上使用Ruby 2.6.5p114。这是怎么回事?

有问题的两个字符是(我用粗体标记了一些有趣的事情(:

  • U+0BC0 泰米尔元音符号 II,具有以下(相关(属性:
    • 一般类别: 非空格标记
    • 字母顺序:是
  • U+0BCD泰米尔语符号维拉玛,具有以下(相关(属性:
    • 一般类别: 非空格标记
    • 字母顺序

Regexp类的 Ruby 文档没有明确说明[[:alpha:]]匹配的内容,但它确实说POSIX 括号表达式匹配非 ASCII 字符,并给出了[[:digit:]]作为示例,说它与 Unicode 属性Nd(十进制数(匹配任何内容。

虽然没有明确记录,但将RegexpPOSIX 括号表达式[[:alpha:]]等同于 Unicode 属性Alphabetic是有意义的,这意味着 U+0BC0 匹配而 U+0BCD 不匹配。

另一方面,Onigmo(YARV中使用的Regexp引擎,并在所有其他实现中镜像(的文档确实明确指定了[[:alpha:]]的工作原理。事实上,它在两个不同的地方指定了它,并且它们相互矛盾:

  • doc/RE中,它说[[:alpha:]]匹配字母|马克
  • doc/UnicodeProps.txt中,它似乎暗示[[:alpha:]]字母匹配

因此,似乎正在发生的事情是,Unicode 联盟不认为 U+0BCD 是按字母顺序排列的,因此,Onigmo 和 Ruby将其归类为[[:alpha:]]。在这种情况下,Onigmo 文档不正确,Ruby 文档也不精确。

最新更新