STUDIO PLUS TWO ブログ

横浜のウェブエンジニアチーム、STUDIO PLUS TWO(スタジオ・プラスツー)の技術ブログです。https://studioplustwo.jp/

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)
#=> "神カロリー"