xtermにASCII拡張コードを書く

xtermにASCII拡張コードを書く

拡張コードを含むテキストをコピーしてxterm(実際にはxfce4-terminal)に貼り付けることができ、正しく表示されます。拡張文字を16進エディタにパイプすると、見栄えがよくなります。たとえば、16進数の「Stéphane」は「53 74 c3 a9 70 68 61 6e 65 0a」と表示されます。 - アクセントがあります。 「e」は16進数でc3で、すべてが正常です。しかし、xtermで拡張コードを書く方法がわかりません。 " echo $'\xc3' " のすべてのバリエーションを試しましたが、何も機能しません。

答え1

é入場してくださいecho -e "\xC3\xA9"

xtermがUTF-8エンコーディングに設定されていると仮定すると、印刷したい文字のUTF-8 16進エンコーディングを見つけることができます。https://www.utf8-chartable.de/

答え2

2バイトシーケンス0xc3 0xa9は、急性U + 00E9文字をé使用して事前組み立てられたUTF-8エンコーディングです。e

locale charmapターミナルエミュレータが返された環境UTF-8(たとえばfr_FR.UTF-8ロケール)で実行されるため、その文字セットを使用するように設定されている場合は、次の結果が得られます。

ISO8859-1またはISO8859-15文字セット(ロケールなど)を使用するように構成された端末では、fr_FR.iso885915@euro0xe9バイトが取得されます。zh_HK.big5hkscsロケールでは 0x88 0x6d などが得られます。

存在するzsh

print '\ue9'
printf '\ue9\n'
echo '\ue9'

ロケールの文字マップにエンコードされたU + 00E9文字を印刷します(後者はbsdechoオプションが有効になっていない場合にのみ必要です。この場合はこれを使用する必要があります。-e通常はecho移植できないコマンドなので避けるのが最善です)。

また、これらの組み込み関数にUnicodeコードポイントに従って文字を出力するのではなく、特定の文字セットの文字エンコーディングに対応するバイトを印刷するように要求することもできます。

誰でも:

print -r -- 'é'
printf '%s\n' 'é'
echo -E - 'é'

バイトを端末に入力としてそのまま渡し、\その-r/-Eオプションを使用して拡張を無効または拡張できるように、8進または16進バイト値を提供します。たとえば、éこの文字のUTF-8エンコーディングの場合:

print  '\xc3\xa9'   # hex
print  '\303\251'   # octal
printf '\xc3\xa9\n' # hex
printf '\303\251\n' # octal (POSIX)
echo   '\xc3\xa9'   # hex
echo   '\0303\0251' # note the extra 0s
printf '%b\n' '\0303\0251' # printf's %b recognises the same escapes
                           # as echo. Was introduced by POSIX to help
                           # people transition away from echo AFAIK.

あるいは、$'...'シェルが同じエスケープシーケンス(エスケープシーケンスではない通常のエスケープシーケンスecho)をサポートする引用形式を使用し、ユーティリティに渡す前に拡張することもできます。

print -r -- $'\ue9' # expanded to eacute character in the locale's charmap
print -r -- $'\xc3\xa9' # passing the UTF-8 encoding of eacute
print -r -- $'\xe9' # passing the ISO8859-1 encoding of eacute

$'...'sh(元の ksh93 で)は言語 POSIX 仕様の次のバージョンに含まれる予定ですが、この$'\uxxxx'部分 (元の zsh で) は拡張に使用する Charmap と何をサポートする実装との間に合意がないため含まれません。 Consensusこの文字テーブルにその文字が含まれていない場合は、これを行います。 zsh の場合、これはコマンドの実行時に適用されるロケールの文字マップです。文字がなければ致命的なエラーです。


¹分解バージョンと混同しないでください。 UTF-8を含む、ASCIIの親セットであるすべての文字セットで、0x65でエンコードされた2文字(U + 0065)で構成されています。e鋭いアクセントと組み合わせるU + 0301文字はUTF-8で0xcc 0x81にエンコードされます。

関連情報