web-dev-qa-db-ja.com

LinuxにSSH接続してEmacsを実行すると、MacターミナルにUnicodeUTF-8が正しく表示されない

Macにログインし、ターミナルを実行し、LinuxシステムにSSHで接続し、emacsウィンドウでmakeを実行しています。私のエラーログは次のようになります:

_raw.cpp:139: error: invalid conversion from âconst char*â to âsize_tâ
_raw.cpp:139: error:   initializing argument 2 of âint snprintf(char*, size_t, const char*, ...)â
_raw.cpp:139: error: invalid conversion from âintâ to âconst char*â
_raw.cpp:139: error:   initializing argument 3 of âint snprintf(char*, size_t, const char*, ...)â

どうやらGCCはユニコードのスマートクォート文字を使おうとしているようですが、UTF-8として送信されており、Emacsがそれらを傍受していることに注意してください。ここでの問題は、EMACSがサブプロセスによって生成されたUTF-8をターミナルに渡す必要があることだと思います。それを実現する方法はありますか?

1
vy32

リモートホストは、端末がUTF-8を使用していることを認識していません。

デフォルトでは、ターミナルはテキストをUTF-8としてエンコードし、デフォルトでは、ターミナルはこれをLANG環境変数を介してターミナルシェルに伝達します(これらの設定を変更していない場合)。

コマンドlocaleで使用されているエンコーディング(および言語)を確認できます。たとえば、これは私のMacで言うことです:

$ locale
LANG="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_CTYPE="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_ALL=

ローカルおよびリモートホストで実行すると、リモートホストのロケール値に「utf-8」が含まれていないことがわかります。

ただし、Mac OS X Lion 10.7より前では、デフォルトでsshはLANG環境変数をリモートホストに通信しません。これを調整することはできますが、MacのsshクライアントがLANG変数を送信するように構成し、リモートホストのsshdデーモンがそれを読み取るように構成する必要があります。

詳細については、Macおよびリモートホストのssh_configおよびsshd_configのマニュアルページを参照してください。 MacのSendEnv LANG LC_*ファイルに/etc/ssh/ssh_configのような行を追加し、リモートホストのAcceptEnv LANG LC_*/etc/ssh/sshd_configを追加します(詳細はリモートホストによって異なる場合があります)。

または、リモートシェルにログインしたら、単にexport LANG="en_US.UTF-8"することもできます(正確な構文は、使用しているリモートシェルによって異なります)。米国英語(「en_US」)でない場合は、必ず正しい言語を使用してください。リモートホストの~/.bash_profileのようなシェル起動スクリプト内からLANGを設定することにより、これを自動化することもできます。

5
Chris Page