web-dev-qa-db-ja.com

DebianでUTF-8文字が正しく表示されない

私の問題の簡単な説明:
最近、bash/nano/irssi/etcにドイツ語のウムラウト(äüö)、ユーロ記号(€)、その他のUTFなどの「特殊な」UTF-8文字を表示できない問題が発生しましたß、§などの-8文字.

私がすでに試したこと:

  • dpkg-reconfigure localesおよび生成されたen_US.UTF-8のみ
  • 設定LC_ALLLANGおよびLANGUAGEからen_US.UTF-8 以内 .bashrcユーザーとルートの両方
  • 再インストールされたロケールとlibx11-data(すべての言語データが含まれているようです)

もちろん、これらすべての変更の後にsshを介して再ログインし、サーバーの再起動を試みましたが、すべてのケースで99,9875%でLinuxの問題が解決されないことがわかっています。

私のシステムに関する情報:
OS:Debianストレッチ-> Linux 3.2.0-4-AMD64#1 SMP Debian 3.2.63-2 x86_64 GNU/Linux
ロケール:v.2.22-7

localeの出力:

LANG=en_US.UTF-8
LANGUAGE=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=en_US.UTF-8

たとえば、コンソールにäと入力してEnterキーを押すと、-bash: $'\344': command not found
正直なところ、私はアイデアがありません。これを手伝ってくれる人はいますか?

7
Steffen

端末がUTF-8エンコーディングを使用することをbashやその他のアプリケーションに伝えました。これは、端末が実際にUTF-8を使用している場合にのみ有効です。 Bashは端末のエンコーディングがそうであると決定することはできません、端末が決定することになります。

UTF-8を使用する場合は、UTF-8を使用するように端末を構成します。 SSHを使用しているので、SSHクライアントを実行している端末をUTF-8を使用するように構成する必要があります。最新のほとんどのシステムではこれがデフォルトですが、どうやらこの方法ではセットアップされていません。

ターミナルでLC_CTYPEを明示的に設定することは避けてください。理想的には、ターミナルがこれを設定します。ただし、これは常に機能するとは限りません(特にSSHを介して)(多くのシステムでは、SSHサーバーはクライアントがLC_CTYPEを設定することを禁止しています)。

環境変数を設定する必要がある場合、適切な場所は .profileではなく.bashrc になります。

(Xベースの端末エミュレーターの1つではなく)Linuxコンソールを使用しているかのように聞こえ、UTF-8モードで実行されていないようです。このスクリプトを使用してオンにします(オフになっている理由を調査します)。

#!/bin/sh
# send character-string to enable UTF-8 mode
if test ".$1" = ".off" ; then
        printf '\033%%@'
else
        printf '\033%%G'
fi

つまり、スクリプトを呼び出すutf8、タイプ

utf8 on

エラーメッセージを調査するために、次のようなスクリプトを2つのフレーバーで作成しました(1つはUTF-8、もう1つはISO-8859-1)。

#!/bin/bash
printf "ä\n"
echo "ä"
ä

UTF-8スクリプトは言う

$ ./foo
ä
ä
./foo: line 4: ä: command not found

iSO-8859-1スクリプトは次のように述べています(UTF-8エンコーディングでlocaleを使用する端末で):

$ ./foo2
�
�
./foo2: line 5: $'\344': command not found

重要なのは、bashがエラーメッセージをロケールに対応するように調整し、UTF-8ロケールでISO-8859-1文字を表示できないことがわかり、8進数として表示されることです。

3
Thomas Dickey