Ruby 按字形拆分Unicode实体

Ruby 按字形拆分Unicode实体,ruby,unicode,normalization,unicode-normalization,grapheme,Ruby,Unicode,Normalization,Unicode Normalization,Grapheme,给我 "d̪".chars.to_a 我如何让Ruby将其按graphemes拆分 ["d"," ̪"] 使用Unicode::text\u元素,这些元素记录在 Ruby2.0 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", "̪

给我

"d̪".chars.to_a
我如何让Ruby将其按graphemes拆分

["d"," ̪"]

使用
Unicode::text\u元素
,这些元素记录在

Ruby2.0

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̪", "é"]

编辑:作为@michau的回答,Ruby 2.5引入了
grapheme\u clusters
方法,以及
each\u grapheme\u cluster
,如果您只想迭代/枚举而不必创建数组的话


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

>“d̪”。扫描/\X/
=>[“d̪”]
>“d̪d̪d̪”。扫描/\X/
=>[“d”、“d”、“d”]
#让我们疯狂起来:
>本月8日,本月月8日,从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从到到到到到到到到从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从从6.̼̹̻̻̻̻̻̻̽!͖̬̰̙̗̿̋ͥͥ̂ͣ̐́́͜͞'
>str.length
=> 75
>str.scan(/\X/).length
=> 6
如果出于任何原因希望匹配图形名边界,可以在正则表达式中使用
(?=\X)
,例如:

>“d̪”.split/(?=\X)/
=>[“d̪”]
如果由于某种原因无法使用
\X
,ActiveSupport(包含在Rails中)也有一种方法:

ActiveSupport::Multibyte::Unicode.unpack_graphemes(“d̪”).map{| code | code.pack(“U*”)

以下代码应适用于Ruby 2.5:

   str = "d̪"

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

   other = str[/\w/]

是否要在grapheme处拆分?并非所有内容都可以正常化,因此使用
s.scan(/\X/)
s.grapheme\u群集更安全。
   str = "d̪"

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

   other = str[/\w/]
"d̪".grapheme_clusters # => ["d̪"]