在bash上查看文件中所有字母的unicode代码点


11

我必须处理一个文件,其中包含许多不可见的控制字符,例如“从右到左”或“零宽度非连接符”,与正常空间不同的空间等等,而我在处理该文件时遇到了麻烦。

现在,我想以某种方式逐字母查看给定文件中的所有字母(我想说的是“从左到右”,但不幸的是,我正在处理从右到左的语言),作为Unicode代码点,仅使用基本的bash工具(如vilesscat...)。有可能吗?

我知道我可以用十六进制显示文件hexdump,但是我必须重新计算代码点。我真的很想查看实际的unicode代码点,因此我可以在Google上搜索它们并找出正在发生的情况。

编辑:我要补充一点,我不想将其转码为其他编码(因为这就是我在网上找到的内容)。我在UTF8中有文件,这很好。我只想知道所有字母的确切代码点。

Answers:


6

我为自己写了一个perl单行代码,可以做到这一点,并且还可以打印原始字符。(它需要来自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的回答启发,这是一个适用于字符串而不是单个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.

我还制作了一个Bash脚本,该脚本从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"

样品输出

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.