macOSのターミナル.appで「Control +V で非ASCII入力をエスケープ」を有効にしているとマルチバイト文字の入力が変になるという話を調べてみました。

経緯

Unable to type non-ASCII chars on Mac <ffffffff> ではまったという話をみて気になったので調べました。

調査

最初は雑に system("stty raw -echo") で調査したら、戻し忘れて変になったので、ちゃんと STDIN.raw を使って戻すようにして試しなおしました。

通常の「Control +V で非ASCII入力をエスケープ」が無効の状態では a でも でも問題なく入力できました。

% ruby -r io/console -e 'p STDIN.raw{STDIN.sysread(80)}'
"a"
% ruby -r io/console -e 'p STDIN.raw{STDIN.sysread(80)}'
"\xE3\x81\x82"

設定から「Control +V で非ASCII入力をエスケープ」にチェックを入れて有効にした状態では a は問題なくて、 の各バイトに Control-V (\x16) がついていました。

% ruby -r io/console -e 'p STDIN.raw{STDIN.sysread(80)}'
"a"
% ruby -r io/console -e 'p STDIN.raw{STDIN.sysread(80)}'
"\x16\xE3\x16\x81\x16\x82"

zsh での Control-V

bindkey の出力から Control-V の割り当てを確認します。 そして zshzle の manpage から /quoted-insert で検索しました。

% bindkey | grep V
"^V" quoted-insert
"^X^V" vi-cmd-mode
% man zshzle

名前の通り、次の文字をそのまま入力する機能です。 個人的には echo ^V^G で BEL 文字を入力して visual bell になっているか試す、というような用途に使うことがあります。


              quoted-insert
              vi-quoted-insert
                     Quote the character to insert into the minibuffer.

まとめ

zsh で Control-V は quoted-insert なので、環境によってはマルチバイトの入力に必要なことがあるのかもしれませんが、 日本語環境では文字が壊れて困ることが多そうで変更しない方が良い設定だとわかりました。

Disqus Comments

Kazuhiro NISHIYAMA

Ruby のコミッターとかやってます。 フルスタックエンジニア(って何?)かもしれません。 About znzに主なアカウントをまとめました。

znz znz


Published