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"