我必须处理一个包含大量不可见控制字符的文件,例如“从右到左”或“零宽度非连接符”,与正常空间不同的空间等等,我在处理这些问题时遇到了麻烦。
现在,我想以某种方式逐个字母查看给定文件中的所有字母(我想说“从左到右”,但不幸的是我正在处理从右到左的语言),作为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()]))'