Xem mã điểm unicode cho tất cả các chữ cái trong tệp trên bash


10

Tôi phải xử lý một tệp có nhiều ký tự điều khiển vô hình, như "phải sang trái" hoặc "không tham gia chiều rộng bằng không", các không gian khác với không gian bình thường, v.v. và tôi gặp khó khăn khi xử lý vấn đề đó.

Bây giờ, tôi muốn bằng cách nào đó xem tất cả các chữ cái trong một tệp nhất định, từng chữ cái (tôi muốn nói "từ trái sang phải", nhưng tôi không may xử lý ngôn ngữ từ phải sang trái) , như các mật mã unicode, chỉ sử dụng công cụ bash cơ bản (như vi, less, cat...). Có thể bằng cách nào đó?

Tôi biết tôi có thể hiển thị tệp theo hệ thập lục phân hexdump, nhưng tôi sẽ phải tính toán lại các điểm mã. Tôi thực sự muốn xem các điểm mã unicode thực tế, vì vậy tôi có thể google chúng và tìm hiểu những gì đang xảy ra.

chỉnh sửa: Tôi sẽ thêm rằng tôi không muốn chuyển mã nó sang mã hóa khác (vì đó là những gì tôi đang tìm hiểu trực tuyến). Tôi có tệp trong UTF8 và điều đó là tốt. Tôi chỉ muốn biết các mật mã chính xác của tất cả các chữ cái.

Câu trả lời:


5

Tôi đã viết cho mình một perl one-liner, làm được điều đó, và nó cũng in ra ký tự gốc. (Nó mong đợi tệp từ STDIN)

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

Tuy nhiên, nên có một cách tốt hơn thế này.


4

Tôi cần điểm mã cho một số biểu tượng mặt cười thông thường và đã đưa ra điều này:

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

mà in

U+1F60A

đó là điểm mã cho "MẶT NẠ VỚI MẮT MẮT" .


2

Lấy cảm hứng từ câu trả lời của Neftas , đây là một giải pháp đơn giản hơn một chút, hoạt động với các chuỗi, thay vì một char:

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.

Tôi cũng đã tạo một tập lệnh Bash đọc từ stdin hoặc từ một tệp và hiển thị văn bản gốc cùng với các giá trị unicode:

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"

Sản lượng mẫu

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.