この記事を3行で
- zshで「rails console」もしくは「irb」コマンド時に日本語が文字化けする。
- 原因は、zshがmacのデフォルトのRubyを参照していたため。
- zshにrbenvを使う設定をしたら日本語文字化けが解消した。
経緯
いつものようにターミナルを開くと、「macのデフォルトシェルがzshになりました」と案内が。
言われた通り、シェルをzshに変更するコマンドを実行。
$ chsh -s /bin/zsh
するとRuby環境で日本語が文字コードに変換される文字化けが発生。
$ irb
irb(main):001:0> "\U+FFE3\U+FFE3\U+FFE3"
$ rails c
irb(main):001:0> "\U+FFE3\U+FFE3\U+FFE3"
【原因1】zshがデフォルトのRubyを参照している
筆者の場合、rbenv経由でRubyを利用しています。
変更の際に、zshがmacデフォルトのRubyを参照していたことが原因でした。
現在、参照しているRubyパスを確認する
$ which ruby
/usr/bin/ruby # macデフォルトのRubyパス
【対応】zshにrbenvを使う設定を行う
zsh起動時にrbenvを使ってRubyを参照するように設定します。
なお、この対応方法は
-
rbenvを使ってRubyを管理している
-
他のシェルのRuby実行環境では日本語が打てていた
場合の対処法となります。
1. zshrcファイルにrbenvのパスを追加する
vi
コマンドで.zshrcファイルを開きます。ファイルが存在しない場合は、新規ファイルとして開きます。
$ vi ~/.zshrc
a
もしくは、i
のキーボードを押してINSERTモードにします。
-- INSERT --
rbenvのパスを追加します。
export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init - zsh)"
esc
キーを押して、INSERTモードから抜けます。
:wq
でファイルを保存して終了します。
2. zshrcファイルの確認
確認したい場合は、もう一度viコマンドを実行します。
export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init - zsh)"
~
"~/.zshrc" 3L, 88C
確認が取れたら、:q
で終了します。
3. zshrcファイルを読み込む
source
コマンドを使って、zshrcファイルの変更を反映させます。
$ source ~/.zshrc
参照しているRubyパスを確認します。
$ which ruby
/Users/ユーザー名/.rbenv/shims/ruby
上記のように、rbrnv経由でRubyを参照していれば成功です。
zshrcファイルがうまく反映しない場合
ターミナルを完全に閉じて開き直す、もしくはシェルを再起動するコマンドを実行してみてください。
# シェル再起動コマンド
$ exec $SHELL -l
参考
原因1のまとめ
他のシェルのRubyコマンド入力では日本語が打てていたのに、zshに変更した途端日本語が文字化けするようになった場合。
zshにrbenvを使うよう zshrcファイルにパスを渡すと解決します。
もっと直接的な原因を言うと、デフォルトのRuby実行環境で参照しているライブラリ(libedit)が日本語対応していないために起こったエラーとなります。
下では、そのライブラリの対処方法について触れています。
【原因2】Rubyコマンド入力のライブラリが日本語対応していない
rails consoleやirbなど、Rubyコマンド入力の際に参照しているライブラリが「libedit」の場合、日本語に対応していないので文字化けが発生します。
コマンド入力ライブラリの確認方法(rbenv利用時)
- 現在のRubyバージョンを確認する
$ rbenv version
2.6.3 (set by /Users/ユーザー名/.ruby-version)
-
readline.bundle(redlineライブラリの管理ファイル?)のパスを調べる
find
コマンド は、ファイルやディレクトリを検索するコマンドです。
$ find ~/.rbenv/versions -name readline.bundle
/Users/ユーザー名/.rbenv/versions/2.5.3/lib/ruby/2.5.0/x86_64-darwin17/readline.bundle
/Users/ユーザー名/.rbenv/versions/2.6.3/lib/ruby/2.6.0/x86_64-darwin19/readline.bundle
-
readline.bundleが参照しているライブラリを調べる(筆者の場合v2.6.3)
otool -L
コマンド は、そのファイルが参照しているライブラリ一覧を表示してくれるコマンドです。
$ otool -L /Users/ユーザー名/.rbenv/versions/2.6.3/lib/ruby/2.6.0/x86_64-darwin19/readline.bundle
# このライブラリが原因
/usr/lib/libedit.3.dylib (compatibility version 2.0.0, current version 3.0.0)
コマンド入力ライブラリの確認方法(デフォルトのRuby利用時)
- Ruby実行環境にログイン
$ irb
- readline.bundleのパスを調べる
irb(main):001:0> puts $LOADED_FEATURES.grep /readline/
/Users/ユーザー名/.rbenv/versions/2.6.3/lib/ruby/2.6.0/x86_64-darwin19/readline.bundle
- readline.bundleが参照しているライブラリを調べる(上記と同じ)
$ otool -L <readline.bundleのパス>
【対応】libeditをreadlineに変更する
readline.bundleが参照しているライブラリを、「libedit」から「readline」に変更することで日本語文字化けの対応ができます。
最初に「readline」のインストール確認
下記コマンドで、ファイルパスが出てこればインストール済みです。
$ brew list readline | grep libreadline.dylib
/usr/local/Cellar/readline/7.0.3_1/lib/libreadline.dylib
パスが出てこなければreadlineのインストール
もしインストールされていなければ、Homebrewを使ってインストールします。
$ brew install readline
「libedit」→「readline」にライブラリを変更する
参照ライブラリの変更には、install_name_tool -change
コマンドを利用します。
書き方は以下のとおりです。
$ install_name_tool -change libeditのパス readlineのパス readline.bundleのパス
libeditのパス▼
/usr/lib/libedit.3.dylib
readlineのパス▼
/usr/local/Cellar/readline/7.0.3_1/lib/libreadline.dylib
readline.bundleのパス▼
/Users/ユーザー名/.rbenv/versions/2.6.3/lib/ruby/2.6.0/x86_64-darwin19/readline.bundle
最終的なコマンド▼
おそらく、デフォルトのRubyを変更する場合はsudoコマンドをつける必要があります。
$ install_name_tool -change "/usr/lib/libedit.3.dylib" "/usr/local/Cellar/readline/7.0.3_1/lib/libreadline.dylib" "/Users/ユーザー名/.rbenv/versions/2.6.3/lib/ruby/2.6.0/x86_64-darwin19/readline.bundle"
readlineに変更できたか確認する
otool -L
コマンドで参照ライブラリを確認しましょう。
$ otool -L <readline.bundleのパス>
/usr/local/opt/readline/lib/libreadline.7.dylib
「/usr/lib/libedit.3.dylib」のパスから「libreadline」に変更されていれば成功です。
原因2のまとめ
readline.bundleが参照しているライブラリを「libedit」から、日本語に対応している「readline」に変更することで文字化けが解消されます。
そもそも、こちらの対処法が根本的な解決方法です。
筆者の場合、rbenvが既に「readline」を参照していたのでこの解決方法は使いませんでした。
この記事には、デフォルトRuby利用時のライブラリを変更する方法が、分かりやすく書かれていたのでオススメです。↓
その他の参考
さいごに
自分のRuby環境が、
- rbenvなのか?
- macデフォルトなのか?
- 今見ているRubyパスはどこか?
を見極めて、環境に合ったエラー対応を行いましょう。
筆者は「今見ているRubyパス」の確認を怠り、1日を無駄にしたのでその1日をここに共有します。
ご参考までに。