ดู codecoints unicode สำหรับตัวอักษรทั้งหมดในไฟล์ที่ทุบตี


11

ฉันต้องจัดการกับไฟล์ที่มีอักขระควบคุมที่มองไม่เห็นจำนวนมากเช่น "จากขวาไปซ้าย" หรือ "ไม่มีความกว้างเป็นศูนย์" ช่องว่างต่างจากพื้นที่ปกติเป็นต้นและฉันมีปัญหาในการจัดการกับสิ่งนั้น

ตอนนี้ฉันต้องการที่จะดูตัวอักษรทั้งหมดในไฟล์ที่กำหนดตัวอักษรตัวอักษร(ฉันอยากจะพูดว่า "จากซ้ายไปขวา" แต่ฉันโชคไม่ดีที่เกี่ยวข้องกับภาษาจากขวาไปซ้าย)เป็น codepoints unicode โดยใช้เพียง เครื่องมือทุบตีพื้นฐาน (เช่นvi, less, cat... ) เป็นไปได้ไหม?

ฉันรู้ว่าฉันสามารถแสดงไฟล์ในฐานสิบหกโดยhexdumpแต่ฉันจะต้องคำนวณ codepoints อีกครั้ง ฉันต้องการเห็น codepoints ของ unicode จริงๆดังนั้นฉันจึงสามารถ google พวกเขาและค้นหาว่าเกิดอะไรขึ้น

แก้ไข: ฉันจะเพิ่มที่ฉันไม่ต้องการแปลงเป็นรหัสที่แตกต่างกัน (เพราะนั่นคือสิ่งที่ฉันกำลังหาออนไลน์) ฉันมีไฟล์ใน UTF8 และนั่นก็ใช้ได้ ฉันแค่อยากรู้ codepoints ที่แน่นอนของตัวอักษรทั้งหมด

คำตอบ:


6

ฉันเขียน perl one-liner ที่ทำแค่นั้นและมันก็พิมพ์ตัวละครดั้งเดิม (คาดว่าไฟล์จาก 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

ซึ่งเป็นจุดรหัสสำหรับ"หน้ายิ้มตายิ้ม"


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.

ฉันยังสร้าง Bash script ที่อ่านจาก stdin หรือจากไฟล์และแสดงข้อความต้นฉบับควบคู่กับค่า 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"

ตัวอย่างผลลัพธ์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.