ASCII 以外の文字は bash に表示されなくなります。

ASCII 以外の文字は bash に表示されなくなります。

修正する:これはファイルシステムの問題ではありません。

私は次のように入力できました:

$ echo kødpålæg

しかし今、bash / zshは次のように変更します。

bash$ echo kddddddddplg
zsh$ echo k<c3><b8>dp<c3><a5>l<c3><a6>g

cat問題なく「kødpålæg」を実行して入力できます。

$ cat
kødpålæg
kødpålæg

この環境にはこれらすべてが含まれます。

$ locale   
LANG=C
LANGUAGE=C
LC_CTYPE="C"
LC_NUMERIC="C"
LC_TIME="C"
LC_COLLATE="C"
LC_MONETARY="C"
LC_MESSAGES="C"
LC_PAPER="C"
LC_NAME="C"
LC_ADDRESS="C"
LC_TELEPHONE="C"
LC_MEASUREMENT="C"
LC_IDENTIFICATION="C"
LC_ALL=C

そしてここ:

$ locale 
LANG=da_DK.utf8
LANGUAGE=da_DK.utf8
LC_CTYPE="da_DK.utf8"
LC_NUMERIC="da_DK.utf8"
LC_TIME="da_DK.utf8"
LC_COLLATE="da_DK.utf8"
LC_MONETARY="da_DK.utf8"
LC_MESSAGES="da_DK.utf8"
LC_PAPER="da_DK.utf8"
LC_NAME="da_DK.utf8"
LC_ADDRESS="da_DK.utf8"
LC_TELEPHONE="da_DK.utf8"
LC_MEASUREMENT="da_DK.utf8"
LC_IDENTIFICATION="da_DK.utf8"
LC_ALL=da_DK.utf8

csh「kødpålæg」を変更しないでください。

「kødpålæg」と入力できるように元の動作を復元するにはどうすればよいですか?

次のいずれかを実行すると、前の動作が生成されます。

LC_ALL=en_GB.utf-8 luit
LC_ALL=da_DK.utf-8 luit
LC_ALL=en_GB.iso88591 luit
LC_ALL=da_DK.iso88591 luit

ただし、その単一セッションにのみ適用されます。

これ:

$ od -An -vtx1
ø

以下を提供します。

 c3 b8 0a

したがって、Konsoleからbashへの入力はUTF8のようです。

$ konsole --version
QCoreApplication::arguments: Please instantiate the QApplication object first
Qt: 5.5.1
KDE Frameworks: 5.18.0
Konsole: 15.12.3

$ bash --version
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

$ zsh --version
zsh 5.1.1 (x86_64-ubuntu-linux-gnu)

$ dpkg -l csh
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name              Version       Architecture  Description
+++-=================-=============-=============-========================================
ii  csh               20110502-2.1u amd64         Shell with C-like syntax

ベストアンサー1

端末が正しく構成されていないため、一部のシングルバイト文字セット(おそらくISO8859-1またはISO8859-15)に文字を送信して表示している可能性があります。表示される例の文字がロケールの文字セットではないことを考慮してください。

通常、Cロケールにはø、、文字åがなく、æこれらの文字(0xf8、0xe5、0xe6)のISO8859-1(5)エンコーディングはUTF-8で有効な文字を形成しません。 readlineやzleなどの行エディタは、カーソルを正しく配置できるように表示列を構成するバイト数を知る必要があるため、文字でデコードする必要があります。

また、ほとんどのシステムでASCIIを使用するCロケールでは、ASCIIにビット8が設定されている文字がないため、ビット8はbash意味として解釈されますMeta。 0xF8 はMeta+x(0x78 (x) | 0x80) として理解されます。これは、Alt+x一部の端末でonまたはoffに送信するためですMeta+x

bashMxは基本的に何にもバインドされていませんが、ßM-_として理解され、最後の単語が挿入されます。次の方法でドラッグできます。

bind 'set convert-meta off'

このようなシェルは、csh文字が複数のバイトで構成されているか、単一の列幅以外のものを占める可能性があるという事実さえ知るには古すぎて、気にしません。

この理論をテストするには:

od -An -vtx1

次に、この文字を入力して^D^Dどのエンコーディングが表示されるかを確認します。 0xf8が見えたら、ø私が正しいことを意味します。 UTF-8エンコーディングである0xc3 0xb8が見えたら、ø私が間違っていることを意味します。

または、ロケールを次に変更しda_DK.iso88591locale -aシステムでロケールの正確な名前を確認)、よりうまく機能することを確認してください。

端末がこれらの文字の誤ったエンコーディングを送信する理由は、文字セットiso8859-1を使用するロケールで開始されたためです。たぶん、ロケールを無視して特定の文字セットを使用するように設定されている可能性があります。文字セットまたはコーディング構成から)。または、sshロケールが文字セットとしてISO8859-1(5)を使用する他のシステムから入力することもできます。

UTF-8 端末で次のコマンドを実行すると、動作を再現できます。

LC_ALL=en_GB.iso885915 luit

次に、内部的にluitロケールをCUTF-8ロケールに変更し、ASCII以外の文字を入力します。

おすすめ記事