按字母拆分Unicode实体

时间:2012-10-22 18:55:47

标签: ruby unicode normalization unicode-normalization grapheme

"d̪".chars.to_a

给了我

["d"," ̪"]

如何让Ruby通过字形分割它?

["d̪"]

5 个答案:

答案 0 :(得分:3)

在Ruby 2.0或更高版本中,您可以使用str.scan /\X/

> "d̪".scan /\X/
=> ["d̪"]
> "d̪d̪d̪".scan /\X/
=> ["d̪", "d̪", "d̪"]

# Let's get crazy:


> str = 'Z͑ͫ̓ͪ̂ͫ̽͏̴̙̤̞͉͚̯̞̠͍A̴̵̜̰͔ͫ͗͢L̠ͨͧͩ͘G̴̻͈͍͔̹̑͗̎̅͛́Ǫ̵̹̻̝̳͂̌̌͘!͖̬̰̙̗̿̋ͥͥ̂ͣ̐́́͜͞'


> str.length
=> 75
> str.scan(/\X/).length
=> 6

如果您因任何原因想要匹配字形边界,可以在正则表达式中使用(?=\X),例如:

> "d̪".split /(?=\X)/
=> ["d̪"]

ActiveSupport(包含在Rails中)也有一种方法,如果您出于某种原因无法使用\X

ActiveSupport::Multibyte::Unicode.unpack_graphemes("d̪").map { |codes| codes.pack("U*") }

答案 1 :(得分:1)

使用unicode.gem中记录的http://www.yoshidam.net/unicode.txt中的Unicode::text_elements

irb(main):001:0> require 'unicode'
=> true
irb(main):006:0> s = "abčd̪é"
=> "abčd̪é"
irb(main):007:0> s.chars.to_a
=> ["a", "b", "č", "d", "̪", "é"]
irb(main):009:0> Unicode.nfc(s).chars.to_a
=> ["a", "b", "č", "d", "̪", "é"]
irb(main):010:0> Unicode.nfd(s).chars.to_a
=> ["a", "b", "c", "̌", "d", "̪", "e", "́"]
irb(main):017:0> Unicode.text_elements(s)
=> ["a", "b", "č", "d̪", "é"]

答案 2 :(得分:1)

以下代码应在Ruby 2.5中运行:

"d̪".grapheme_clusters # => ["d̪"]

答案 3 :(得分:0)

我不知道为什么你的代码不提供unicode代码点,因为新版本的Ruby在使用each_charchars时总是提供unicode代码点,但你可以随时使用:

"d̪".codepoints.to_a

这是针对unicode的。

答案 4 :(得分:0)

Ruby2.0

   str = "d̪"

   char = str[/\p{M}/]

   other = str[/\w/]