Bash에서 다른 코드 포인트로 ASCII 문자를 인쇄하는 방법은 무엇입니까?

Bash에서 다른 코드 포인트로 ASCII 문자를 인쇄하는 방법은 무엇입니까?

ASCII 테이블에는 다양한 숫자 체계의 코드 포인트가 있는 "J" 문자가 있습니다.

Oct   Dec   Hex   Char
112   74    4A    J

printf '\112'이 문자는 또는 를 인쇄하여 8진수 코드 포인트로 인쇄할 수 있습니다 echo $'\112'. 10진수 및 16진수 코드 포인트 표현을 통해 동일한 문자를 어떻게 인쇄할 수 있습니까?

답변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

따라서 변수 값의 일부인 문자를 인쇄하는 방법이 필요합니다.
그러나 여기에는 두 가지 가능한 접근 방식이 있습니다.

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

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

두 개의 printf가 필요합니다. 하나는 값을 16진수 문자열로 변환하고 다른 하나는 실제로 문자를 인쇄합니다.

두 번째는 유니코드 포인트를 인쇄합니다(콘솔이 올바르게 설정된 경우).
예를 들어:

$ 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개 가정).

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

관련 정보