Edited at

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

More than 3 years have passed since last update.


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 "𠮷">


参考