UnicodeをRubyで扱うときに使用する操作いろいろ
ある文字のUnicodeコードポイントを知りたい、または逆にコードポイントから文字を調べたい....と思うことがよくあるので、irbで打ち込むいろいろな操作のメモ。
(以下の例では、Rubyの文字列リテラルのエンコーディングはUTF-8の前提。)
コードポイント → UTF-8文字
Integer#chr
メソッドを使用。
> 0x3042.chr(Encoding::UTF_8) # => "あ"
コードポイント配列 → UTF-8文字列
配列要素単位で Integer#chr
、またはまとめて Array#pack
。
> [0x3042, 0x3044, 0x3046, 0x3048, 0x304A].map {|n| n.chr(Encoding::UTF_8)}.join #=> "あいうえお"
または
> [0x3042, 0x3044, 0x3046, 0x3048, 0x304A].pack('U*') #=> "あいうえお"
UTF-8文字 → コードポイント
String#ord
メソッドを使用。(返り値はArray
となるが、String#codepoints
でもよい)
> 'あ'.ord.to_s(16) #=> "3042"
UTF-8文字列 → コードポイント配列
- 1文字ずつ区切って
String#ord
String#codepoints
で一気に配列化(またはString#each_codepoint
)String#unpack
> 'あいうえお'.split('').map{|c| c.ord.to_s(16) } #=> ["3042", "3044", "3046", "3048", "304a"]
または
> 'あいうえお'.codepoints.map{|n| n.to_s(16) } #=> ["3042", "3044", "3046", "3048", "304a"]
または
> 'あいうえお'.unpack('U*').map{|n| n.to_s(16) } #=> ["3042", "3044", "3046", "3048", "304a"]
Unicode正規化
String#unicode_normalize
メソッドを使用。
> '神㌍'.unicode_normalize(:nfkc) #=> "神カロリー"