2012-10-22 58 views

回答

1

使用來自unicode.gemUnicode::text_elements,其記錄在http://www.yoshidam.net/unicode.txt

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

我不知道爲什麼你的代碼不給Unicode代碼點,因爲Ruby的新版本使用each_charchars時總是給Unicode代碼點,但你可以隨時使用:

"d̪".codepoints.to_a 

這是爲unicode。

+0

#=>「[100,815]」 – Reactormonk

+0

@Tass好吧,它可能是您的Ruby或操作系統支持的問題。看看這個:http://stackoverflow.com/questions/5560914/how-do-i-escape-a-unicode-string-with-ruby你可能不得不手動打包每個2字節到一個如答案中所示。 – texasbruce

+0

我剛剛設置了操作系統編碼爲'UTF8','default_ {internal,external}'也設置爲'UTF8'。 'unpack('U *')'也給我兩個字節。 – Reactormonk

0

Ruby2.0

str = "d̪" 

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

    other = str[/\w/] 
0

在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*") }