Posted at

irbで日本語が入力できなかった時の対応方法


irbで日本語を打ったら文字化けした

$ irb

として適当に日本語の変数を入れたみたところ

irb(main):001:0> b = '\U+FFE5\U+FFA0'

と表示されて文字化けをしてしまった。

別にこれができなくても開発は出来ないわけではないが、気持ち悪いので直すことに。


  • 方法1(僕はこちらを試しました):コマンド入力ライブラリを変更する

  • 方法2:Rubyのアンインストール→再インストール

ググってみたところ上記2通りが出てきましたが、僕は1の方法でやってみました。(2でも解決している方は多数いそうです。)

ちなみに

irbがコマンド入力を受け取る際に使っているライブラリ(libedit)が日本語に対応していないのが原因であるらしく、日本語対応のライブラリ(readline)に切り替えることで解決ができる模様。


ライブラリの参照先を変更する

$ brew list readline | grep libreadline.dylib

これで

/usr/local/Cellar/readline/7.0.5/lib/libreadline.dylib

のような形でパスが返ってくる場合はインストール済みなので、これをメモ帳にでも保存しておいて、そのまま下記の手順へ。

もしインストールされていない場合は

$ brew install readline

でインストールする。

インストールしただけでは何も起こらないので、ここから設定開始。

まずは

$ irb

そこで

> puts $LOADED_FEATURES.grep /readline/

と入力。

/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/universal-darwin13/readline.bundle

のようなパスがでてくるので、それをどこかに保存します。(メモ帳とかでOK)

このreadline.bundleが参照しているのが日本語が使えないライブラリを参照してしまっているようなので、その参照先を変更します。

readline.bundleが参照しているライブラリは、

$ otool -L

というコマンドで参照できるのでさきほどのパスをここに入れて

$ otool -L /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/universal-darwin13/readline.bundle

とコマンドを打ちます。

結果として

/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/libruby.2.0.0.dylib (compatibility version 2.0.0, current version 2.0.0)

/usr/lib/libedit.3.dylib (compatibility version 2.0.0, current version 3.0.0)
/usr/lib/libncurses.5.4.dylib (compatibility version 5.4.0, current version 5.4.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1197.1.1)
/usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0)

といった感じでライブラリの参照先が出てくるので、一番上の

/usr/lib/libedit.3.dylib

をまたメモ帳にでもメモしておきます。

これで準備ができたので

$ install_name_tool -change

というコマンドを使って参照するパスを変更していきます。

と、その前に一応メモした内容が何だったのか、ということだけ整理しておきます。

内容
結果

参照しているbundleのパス
/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/universal-darwin13/readline.bundle

古いライブラリのパス
/usr/lib/libedit.3.dylib

新しいライブラリのパス
/usr/local/Cellar/readline/7.0.5/lib/libreadline.dylib

それぞれのパスを使って、参照先を変えます。

コマンドの使い方は下記になります。

$ install_name_tool -change 古いライブラリのパス 新しいライブラリのパス 参照しているbundleのパス

上記の例の場合はかなり長いコマンドになりますが、こんな感じですね。

$ install_name_tool -change /usr/lib/libedit.3.dylib /usr/local/Cellar/readline/7.0.5/lib/libreadline.dylib /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/universal-darwin13/readline.bundle

僕の場合はこの方法で解決しました。