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
僕の場合はこの方法で解決しました。