rubyでunicode, UTF8を扱うためのTips


Unicodeコードポイント -> 文字列

0x1F5FF.chr("UTF-8")
=> "🗿"

文字列 -> Unicodeコードポイント

"🗿".codepoints.map{|v| v.to_s(16)}
=> ["1f5ff"]

文字列 -> UTF8 16進数

 "🗿".bytes.map{|v| v.to_s(16)}.join
=> "f09f97bf"

UTF8 16進数 -> 文字列

puts ["f09f97bf"].pack("H*")
🗿

絵文字か知りたい

Unicodeプロパティを使うと楽

"🗿".match(/[\p{In_Miscellaneous_Symbols_and_Pictographs}\p{In_Emoticons}]/)
=> #<MatchData "🗿">

Unicodeプロパティ?

Unicodeコンソーシアムが出した文字範囲に関する規格

Rubyの正規表現エンジン「Onigmo」で使えるUnicodeプロパティについては、以下の「Character Property」を参照

各Unicodeプロパティの文字範囲を知りたい

めちゃくちゃ長いファイルだけれど、Onigmo のヘッダファイルみればわかる

罠も多いので注意

Alphabetic

英文アルファベットではなく 全ての言葉の内、記号、数字、空白ではない文字 を指す

  • 日本語も当然ヒットする

Katakana

  • 全角カナ
  • 半角カナ
  • ㋐〜㋾ (!)
  • ㌀〜㍗ (!!!)
  • 𛀀(?)

などなど...

  • 厳密にやりたいなら、下のように正規表現を使ってコードポイントの範囲指定をした方が良いと思う

UTF-8で4バイトになる文字が知りたい

正規表現で範囲指定すれば楽

"𠮷".match(/[\u{10000}-\u{10FFFF}]/)
=> #<MatchData "𠮷">

参考