Bash에서 다른 코드 포인트로 ASCII 문자를 어떻게 인쇄합니까?

Bash에서 다른 코드 포인트로 ASCII 문자를 어떻게 인쇄합니까?

ASCII 테이블에는 서로 다른 숫자 체계의 코드 포인트를 갖는 'J' 문자가 존재합니다.

Oct   Dec   Hex   Char
112   74    4A    J

printf '\112'또는 를 인쇄하여 8진수 코드 포인트로 이 문자를 인쇄할 수 있습니다 echo $'\112'. 10진수 및 16진수 코드 포인트 프리젠테이션으로 동일한 문자를 어떻게 인쇄합니까?

답변1

마녀:

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

마녀:

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"

관련 정보