コラム 3. プログラミング情報
2019年11月10日に公開

zshに変えたらrails c & irbで日本語文字化けに対応する【zshでrbenvを使う】

この記事を3行で

  • zshで「rails console」もしくは「irb」コマンド時に日本語が文字化けする。
  • 原因は、zshがmacのデフォルトのRubyを参照していたため。
  • zshにrbenvを使う設定をしたら日本語文字化けが解消した。

経緯

いつものようにターミナルを開くと、「macのデフォルトシェルがzshになりました」と案内が。

2019-11-10 09-21-18

言われた通り、シェルを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

参考

Macのzshでrbenvを使う -Qiita

原因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利用時のライブラリを変更する方法が、分かりやすく書かれていたのでオススメです。↓

日本語が使えるirbにしておく - ザリガニが見ていた…。

その他の参考

Rails consoleで日本語入力ができるようにする - Qiita

さいごに

自分のRuby環境が、

  • rbenvなのか?
  • macデフォルトなのか?
  • 今見ているRubyパスはどこか?

を見極めて、環境に合ったエラー対応を行いましょう。

筆者は「今見ているRubyパス」の確認を怠り、1日を無駄にしたのでその1日をここに共有します。

ご参考までに。

現在、カテゴリー「Rails apiとNuxt.jsでSPA開発」のデモアプリを構築中です。記事になるまでもう少々のお時間が必要です。ブログの更新が止まって申し訳ありません。デモアプリの進捗状況は こちらの記事 で随時お伝えしてまいります。
スポンサー広告
スポンサー広告