bash에서 파일의 모든 문자에 대한 유니 코드 코드 포인트보기


11

"right to left"또는 "zero width non-joiner"와 같이 보이지 않는 제어 문자가 많은 파일, 일반 공간과 다른 공간 등을 처리해야하며,이를 처리하는 데 문제가 있습니다.

이제는 주어진 파일의 모든 문자를 문자별로 보았습니다 ( "왼쪽에서 오른쪽으로 말하고 싶습니다. 그러나 불행히도 오른쪽에서 왼쪽으로 쓰는 언어를 다루고 있습니다") , 유니 코드 코드 포인트 만 사용하여 기본 bash 도구 (예 vi: less,, cat...) 어떻게 든 가능합니까?

로 파일을 16 진수로 표시 할 수 있다는 것을 알고 hexdump있지만 코드 포인트를 다시 계산해야합니다. 실제로 실제 유니 코드 코드 포인트를보고 싶기 때문에 Google에서 해당 코드 포인트를 확인하고 무슨 일이 일어나고 있는지 확인할 수 있습니다.

편집 : 나는 그것을 다른 인코딩으로 트랜스 코딩하고 싶지 않다고 덧붙일 것이다. UTF8로 된 파일이 있는데 괜찮습니다. 모든 문자의 정확한 코드 포인트를 알고 싶습니다.

답변:


6

나는 자신에게 펄 원 라이너를 썼다. 그런 식으로 원래 캐릭터를 인쇄한다. (STDIN에서 파일을 기대합니다)

perl -C7 -ne 'for(split(//)){print sprintf("U+%04X", ord)." ".$_."\n"}'

그러나 이것보다 더 좋은 방법이 있어야합니다.


예, 작동합니다.이 명령이 필요합니다
Yan King Yin

5

나는 일반적인 스마일을위한 코드 포인트가 필요했고 이것을 생각해 냈습니다.

echo -n "😊" |              # -n ignore trailing newline                     \
iconv -f utf8 -t utf32be |  # UTF-32 big-endian happens to be the code point \
xxd -p |                    # -p just give me the plain hex                  \
sed -r 's/^0+/0x/' |        # remove leading 0's, replace with 0x            \
xargs printf 'U+%04X\n'     # pretty print the code point

인쇄

U+1F60A

"SMILING FACE WITH SMILING EYES" 의 코드 포인트입니다 .


3

Neftas의 답변 에서 영감을 얻은 다음은 단일 문자가 아닌 문자열로 작동하는 약간 더 간단한 솔루션입니다.

iconv -f utf8 -t utf32le | hexdump -v -e '8/4 "0x%04x " "\n"' | sed -re"s/0x /   /g"
#                                         ^
# The number `8` above determines the number of columns in the output. Modify as needed.

또한 stdin 또는 파일에서 읽은 유니 코드 값과 함께 원본 텍스트를 표시하는 Bash 스크립트를 만들었습니다.

COLWIDTH=8
SHOWTEXT=true

tmpfile=$(mktemp)
cp "${1:-/dev/stdin}" "$tmpfile"
left=$(set -o pipefail; iconv -f utf8 -t utf32le "$tmpfile" | hexdump -v -e $COLWIDTH'/4 "0x%05x " "\n"' | sed -re"s/0x /   /g")


if [ $? -gt 0 ]; then
    echo "ERROR: Could not convert input" >&2
elif $SHOWTEXT; then
    right=$(tr [:space:] . < "$tmpfile" | sed -re "s/.{$COLWIDTH}/|&|\n/g" | sed -re "s/^.{1,$((COLWIDTH+1))}\$/|&|/g")
    pr -mts" " <(echo "$left") <(echo "$right")
else
    echo "$left"
fi


rm "$tmpfile"

샘플 출력

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.