2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Ruby で文字の情報をさくっと得る(コードポイント,カテゴリーなど)

Last updated at Posted at 2021-04-20

はじめに

プログラミングをしていると,この文字のコードポイントは何だろう?とか,Unicode カテゴリーは何だろう?ということがよくある。
これをさくっと知るには,Unicode の文字情報が詰まった以下のような gem を使うといい1

2021-04-20 追記

コードと実行例を修正し,表示を改善した。改善点は以下のとおり

  • Unicode 名を得るのに Unicode::Name.of でなく Unicode::Name.readable を使った。
    • これにより,制御コードにも名前が表示されるようになった。
  • 文字見本に " " を付けた
  • 制御文字の場合の文字見本を目で見て分かるようにした。
  • Unicode ブロック名のあとにブロックのコードポイントの範囲を表示した。
  • Unicode ブロックのところに Unicode Consortium サイトの当該ブロックの URL を表示した。

※このような表示の改善に関するご提案があればコメントでお願いします。

irb 上で

irb 上で文字情報をさくっと知りたいなら,~/.irbrc

~/.irbrc
require "bundler/inline"

gemfile do
  %w(name categories blocks scripts types).each do
    gem "unicode-" + _1
  end
end

def unicode_info(str)
  u = "U+%04X".method(:%)
  str.each_char do |ch|
    codepoint = u[ch.ord]
    name = Unicode::Name.readable(ch)
    category_long = Unicode::Categories.category(ch, format: :long)
    category_short = Unicode::Categories.category(ch)
    script = Unicode::Scripts.script(ch)
    block = Unicode::Blocks.block(ch)
    block_s, block_e = Unicode::Blocks::INDEX.find{ _3 == block }.then{ [u[_1], u[_2]] }
    type = Unicode::Types.type(ch)
    label = (category_short == "Cc") ? ch.inspect : %("#{ ch }")
    puts <<~EOT
      #{ label }
        codepoint: #{ codepoint }
        name:      #{ name }
        category:  #{ category_long } (#{ category_short })
        script:    #{ script }
        block:     #{ block } (#{ block_s }-#{ block_e })
                   https://www.unicode.org/charts/PDF/U#{ block_s[2..-1] }.pdf
        type:      #{ type }
    EOT
  end
end

とでも書いておこう。
こうしておくと,irb で

irb(main):001:0> unicode_info "𩸽の味!"
"𩸽"
  codepoint: U+29E3D
  name:      CJK UNIFIED IDEOGRAPH-29E3D
  category:  Other_Letter (Lo)
  script:    Han
  block:     CJK Unified Ideographs Extension B (U+20000-U+2A6DF)
             https://www.unicode.org/charts/PDF/U20000.pdf
  type:      Graphic
"の"
  codepoint: U+306E
  name:      HIRAGANA LETTER NO
  category:  Other_Letter (Lo)
  script:    Hiragana
  block:     Hiragana (U+3040-U+309F)
             https://www.unicode.org/charts/PDF/U3040.pdf
  type:      Graphic
"味"
  codepoint: U+5473
  name:      CJK UNIFIED IDEOGRAPH-5473
  category:  Other_Letter (Lo)
  script:    Han
  block:     CJK Unified Ideographs (U+4E00-U+9FFF)
             https://www.unicode.org/charts/PDF/U4E00.pdf
  type:      Graphic
"!"
  codepoint: U+FF01
  name:      FULLWIDTH EXCLAMATION MARK
  category:  Other_Punctuation (Po)
  script:    Common
  block:     Halfwidth and Fullwidth Forms (U+FF00-U+FFEF)
             https://www.unicode.org/charts/PDF/UFF00.pdf
  type:      Graphic
=> "𩸽の味!"

と使える。

もちろん事前に

gem install unicode-name unicode-categories unicode-blocks unicode-scripts unicode-types

として必要な gem をインストールしておく必要がある。

pry なんですけど?

irb じゃなくて pry 使ってる人は ~/.irbrc でなく ~/.pryrc に書けばいい。

~/.irbrc って何?

Windows の人は「~/.irbrc ってなんじゃらほい?」と思うかもしれないが,これは「現在のユーザーのユーザーディレクトリー直下にある .irbrc というファイル」のこと。

ユーザーディレクトリーというのは,C:¥Users の直下にあるユーザーごとのディレクトリー。

コードの補足説明

たぶん,

require "bundler/inline"

gemfile do
  source "https://rubygems.org"
  %w(name categories blocks scripts types).each do
    gem "unicode-" + _1
  end
end

は見慣れない人が多いと思う。
ふつう,gem を使うプロジェクトは必要とする gem の指定を Gemfile に書くが,それをスクリプトファイルのほうに書きたいとき,gemfile メソッドを使う。このメソッドを使うためには bundler/inline を require する。

_1 は番号指定ブロックパラメーターなので,Ruby 2.7 以降を前提としている。それより前の Ruby バージョンなら真面目にブロックパラメーターを書けばよい。

  1. ここに挙げた gem は仲間がほかにもある。また,これらすべてに依存する unicode-x という gem も用意されている。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?