我正在尝试在泰米尔语Unicode代码点上使用Ruby Regexp。u0BC0
和u0BCD
都在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(十进制数(匹配任何内容。
虽然没有明确记录,但将Regexp
POSIX 括号表达式[[: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 文档也不精确。