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

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

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

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

我知道我可以通过 以十六进制显示文件hexdump,但我必须重新计算代码点。我真的很想看到实际的 unicode 代码点,这样我就可以谷歌搜索它们并找出发生了什么。

编辑:我要补充一点,我不想将其转码为不同的编码(因为这是我在网上找到的)。我的文件是 UTF8 格式的,没问题。我只想知道所有字母的确切代码点。

答案1

我自己写了一个 perl 单行程序,它能完成这个任务,并且还能打印原始字符。(它需要来自 STDIN 的文件)

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

然而,应该有比这更好的方法。

答案2

我需要一些常见笑脸的代码点,然后想到了这个:

echo -n "

答案3

这是一个bash仅需要和使用内置功能的解决方案:

while IFS= read -d $'\000' -n 1 x; do printf '%X\n' "'$x"; done

如果你想查看字符及其映射,你可以使用以下命令:

while IFS= read -d $'\000' -n 1 x; do printf '%2s -> %X\n' "$x" "'$x"; done

例如:

$ echo 'Hi! 

答案4

perl 单行程序对我来说不起作用,我无法让 hexdump 方法显示代码点之外的实际字符,因此这里有一个 python 单行程序:

python -c 'import sys; print("\n".join(["\\u%04x -> %s" % (ord(c), c) for c in sys.stdin.read() if c.strip()]))'

输出如下:

$ cat test.txt 
A á Ü Ñ  日本語 1  1  /  _
$ python -c 'import sys; print("\n".join(["\\u%04x -> %s" % (ord(c), c) for c in sys.stdin.read() if c.strip()]))' < test.txt
\u0041 -> A
\u00e1 -> á
\u00dc -> Ü
\u00d1 -> Ñ
\u65e5 -> 日
\u672c -> 本
\u8a9e -> 語
\u0031 -> 1
\uff11 -> 1
\u002f -> /
\u005f -> _

笔记:对于 python2,需要解码文本:

python2 -c 'import sys; print("\n".join(["\\u%04x -> %s" % (ord(c), c) for c in sys.stdin.read().decode("utf-8") if c.strip()]))'

相关内容