Bash で異なるコード ポイントで ASCII 文字を印刷するにはどうすればよいですか?

Bash で異なるコード ポイントで ASCII 文字を印刷するにはどうすればよいですか?

ASCII テーブルには、さまざまな数値システムのコード ポイントを持つ「J」文字が存在します。

Oct   Dec   Hex   Char
112   74    4A    J

または を印刷することで、この文字を 8 進コード ポイントで印刷できます 。同じ文字を 10 進数と 16 進数のコード ポイント表現で印刷するにはどうすればよいでしょうかprintf '\112'echo $'\112'

答え1

16進数:

printf '\x4a'

12月:

printf "\\$(printf %o 74)"

16 進数の代替 :-)

xxd -r <<<'0 4a'

答え2

一般に、シェルは、次のように定義されている場合、変数内の 16 進数、8 進数、10 進数を理解できますintegers

$ declare -i v1 v2 v3 v4 v5 v6 v7
$ v1=0112
$ v2=74
$ v3=0x4a
$ v4=8#112
$ v5=10#74
$ v6=16#4a
$ v7=18#gg
echo "$v1 $v2 $v3 $v4 $v5 $v6 $v7"
74 74 74 74 74 74 304

あるいは、「算術展開」の結果です。

$ : $(( v1=0112, v2=74, v3=0x4a, v4=8#112, v5=10#74, v6=16#4a, v7=18#gg ))
$ echo "$v1 $v2 $v3 $v4 $v5 $v6 $v7"
74 74 74 74 74 74 304

したがって、変数値に属する文字を印刷するには、1 つの方法だけが必要です。
ただし、次の 2 つの方法が考えられます。

$ var=$((0x65))
$ printf '%b\n' "\\$(printf '0%o' "$var")"
e

$ declare -i var
$ var=0x65; printf '%b\n' "\U$(printf '%08x' "$var")"
e

2 つの printf が必要です。1 つは値を 16 進文字列に変換し、もう 1 つは実際に文字を印刷します。

2 番目は、任意の UNICODE ポイントを出力します (コンソールが正しく設定されている場合)。
例:

$ var=0x2603; printf '%b\n' "\U$(printf '%08x' "$var")"

雪だるま。

utf-8で表現される文字はf0 9f 90 aeです0x1F42E。 を検索しcow face site:fileformat.infoますそれを得る:

$ var=0x1F42F; printf '%b\n' "\U$(printf '%08x' "$var")"

答え3

小数点:

chr() {
    local c
    for c
    do
        printf "\\$((c/64*100+c%64/8*10+c%8))"
    done
}

chr 74

16進数:

chr $((16#4a))

この関数はシーケンスを実行できます:

$ chr 74 75 76; echo
JKL
$

答え4

変換する数値のリストがあり、関数呼び出しと各文字のサブシェルの作成を避けたい場合は、事前に ascii セットを定義できます。

ascii=$(for x in {0..9} {A..F}; do for y in {0..9} {A..F}; do echo -ne "\x$x$y"; done; done)

null 文字は除外されるため、すべての文字が 1 ずつオフセットされることに注意してください。

次に、次のようなものを使用します (1 行に 1 つの数値があると想定します)。

while read c; do out+="${ascii:$c-1:1}"; done <<< "$in"
echo "$out"

関連情報