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

# はじめに

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

* [unicode-name](https://rubygems.org/gems/unicode-name)（Unicode 文字名）
* [unicode-categories](https://rubygems.org/gems/unicode-categories)（Unicode カテゴリー）
* [unicode-blocks](https://rubygems.org/gems/unicode-blocks)（Unicode ブロック）
* [unicode-scripts](https://rubygems.org/gems/unicode-scripts)（Unicode スクリプト〔用字系〕）
* [unicode-types](https://rubygems.org/gems/unicode-types)（unicode ベーシックタイプ）

[^unicode-x]: ここに挙げた gem は仲間がほかにもある。また，これらすべてに依存する [unicode-x](https://rubygems.org/gems/unicode-x) という gem も用意されている。

## 2021-04-20 追記

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

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

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

# irb 上で

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

```rb:~/.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
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
=> "𩸽の味！"
```

と使える。

もちろん事前に

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

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

# pry なんですけど？

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

# `~/.irbrc` って何？

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

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

# コードの補足説明

たぶん，

```rb
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 バージョンなら真面目にブロックパラメーターを書けばよい。