rcmdnk's blog
Last update

前にMacでの文字化け対策用のGNU screenのインストールで書いた様に日本語ファイルの表示は出来る様にしてあったのですが、 コマンドラインから日本語を打つと化けると言う現象に悩まされてました。

普段は殆ど必要としないので特に調べないで居たんですが、 色々設定をいじっているうちにとりあえず何が悪いかは分かりました。

Sponsored Links

\M-c in .inputrc

問題は.inputrcの中で

"\M-c": capitalize-word

と設定してあることでした。

この設定いつ書いたかうる覚えですが、 .inputrcに一通りreadline 1 のショートカットが 再定義してあって、恐らくこれはMacに移った時にCommand ボタンがMeta Keyとして効かない、と思った時に 取り敢えず、と言うことで書いてみたんだと思います。 (この辺りのことはまた次回辺り書きたいと思います。)

この設定を外してbashを立ち上げれば日本語を使えるし 日本語ファイルもコマンドラインから操作できる様になりました。 これでiTermから一通り全て日本語が使えます。

ただ、ちょっとまだわからないのが、この\M-cを設定した時だけ日本語が化ける、 と言う点。

実際にファイルには他の項目も\M-の様な書き方で設定してあったんですが、 これらは悪さしてませんでした。

試しに、これらを.inputrcから外して、日本語が書けることを確認した後、

$ bind '"\M-c": capitalize-word'

の様にbindコマンドで再定義してやっても日本語が化ける様になります。 この場合、コマンドラインでM-c 2 を打つ限りは期待通り次の単語の先頭が 大文字になる動きをします。

$ bind '"\M-c": "test"'

の様に他の物にしても駄目。この場合M-cを送るとtestと出力される様になるわけですが、 日本語をうってReturnを押すと書く文字の前にtestと表示され 文字化けがその後に出ます。テストという文字で決定するとtest*test*test* の様な感じに。 \M-cEnterが何か関係しているのか…?

他の

$ bind '"\M-b": "test"'

等は影響が無いみたいで日本語がそのまま打てます。

ざっと調べた所、よく分からなかったので、取り敢えず\M-cについては 設定しちゃだめ、ということだけで置いておきます…

追記: 2013/06/01

キーコードをつらつら見ていたらちょっと分かりました。 cのAsciiコードは(従ってUTF-8でのコードも)01100011 なんですがメタキーを利かすと最上位が1になるので 11100011になります。

一方で、UTF-8でのひらがなとカタカナのコードは3バイトで表現されますが、 全ての文字が1バイト目が11100011で始まります。

従って、ひらがなやカタカナを入力した時、決定した瞬間にまず1バイト目が \M-cで定義されていてしまうとそれに変換されてしまい、 残りの2バイト分が意味不明な状態で残ってしまうわけです。 なので テストという文字で決定するとtest*test*test* の様にそれぞれの文字の1バイト目が変換っされた形になります。

また、漢字は1バイト目が違うので、\M-cを設定した状態でも文字化けしません。 例えば漢字は2進法だと 11100110 10111100 1010001011100101 10101101 10010111 で、それぞれの1バイト目の8ビットを除いた数、0110011001100101は それぞれfeです。 従って、bind '"\M-f":"meta-f"';bind '"\M-e":"meta-e"'の様な設定をすれば 漢字と打って決定した時にmeta-f*meta-e*の様な表示になります。

ということなので、convert-meta offに設定した時はメタプレフィックスな 設定はしちゃ駄目、と言うのが正しい様です。

追記ここまで

meta in inputrc

それからコマンドラインで日本語を表示/使用したいとき、 readlineの設定で

set convert-meta off
set input-meta on
set output-meta on

の様になってる必要があります 3。 (bind -vで確認。)

この設定も.inputrcでそのまま書いておけば反映されます。 (書いた後に反映する場合はC-x C-r)

ただ、使っているLinux端末だと英語環境で使ってますがこれらは /etc/inputrcに最初から書いてあり MacやらWindowsやらでは/etc/inputrcが見当たりませんが、 デフォルトで上の様に設定されていました。

LANG

上のmetaに関する設定で日本語ファイルを作ったりは出来ますが、 lsなどでは化けます。 これを表示するためには

$ echo $LANG

で何になってるか確認してUTF8系でなかったら

$ export LANG=en_GB.UTF-8

などとします(.bashrcに加えておく)。ja_JP.UTF-8にすればコマンド出力等も一部表示が日本語化されます。 en_US.UTF-8もあって、en_GBと殆ど変わらないんですが、 dateの表示がイギリス式のが好きなのでGBにしてあります。

$ export LANG=en_GB.UTF-8
$ date
Wed 29 May 2013 HH:MM:SS XXXX
$ export LANG=en_US.UTF-8
$ date
Wed May 29 HH:MM:SS XXXX 2013
$ export LANG=ja_JP.UTF-8
$ date
2013年 5月29日 水曜日 HH時MM分SS秒 XXXX
Sponsored Links
  1. manページ — READLINE

  2. これも次回書こうと思いますが、iTermだとOptionキーでMetaキーを送る事が出来ます。

  3. Wiki: URF-8 UTF8エンコードをデコードする エンコードの種類 FreeBSD/UTF-8化

Sponsored Links

« コマンドラインからEvernoteへ送るスクリプト メタキー/ESCについて: iTermでそれらのキーを送る設定も »