在命令行上检查/查找字符串中的 UTF-8/Unicode 字符的程序?

在命令行上检查/查找字符串中的 UTF-8/Unicode 字符的程序?

我刚刚意识到我的系统上有一个文件;它正常列出:

$ ls -la TΕSТER.txt 
-rw-r--r-- 1 user user 8 2013-04-11 18:07 TΕSТER.txt
$ cat TΕSТER.txt 
testing

... 然而,它却因与 UTF-8/Unicode 相关的错误而导致软件崩溃。我真的很困惑,因为我不知道为什么这样的文件会出现问题;最后我想起要检查一下 的ls输出hexdump

$ ls TΕSТER.txt 
TΕSТER.txt
$ ls TΕSТER.txt | hexdump -C
00000000  54 ce 95 53 d0 a2 45 52  2e 74 78 74 0a           |T..S..ER.txt.|
0000000d

... 嗯,显然有些字母之间有一些字节,所以我猜这是 Unicode 编码问题。我可以尝试回显这些字节,看看打印了什么:

$ echo -e "\x54\xCE\x95\x53\xD0\xA2\x45\x52\x2E\x74\x78\x74"
TΕSТER.txt

...但我仍然无法分辨这些是哪些 Unicode 字符(如果有的话)。

那么是否有一个命令行工具,可以让我检查终端上的字符串并获取有关其字符的 Unicode 信息?

答案1

尝试使用uniname,它是统一工具Debian 和 Ubuntu 系统上的软件包。以下是 uniname 的实际示例:

echo -e "\x54\xCE\x95\x53\xD0\xA2\x45\x52\x2E\x74\x78\x74" | uniname
No LINES variable in environment so unable to determine lines per page.
Using default of 24.
character  byte       UTF-32   encoded as     glyph   name
        0          0  000054   54             T      LATIN CAPITAL LETTER T
        1          1  000395   CE 95          Ε      GREEK CAPITAL LETTER EPSILON
        2          3  000053   53             S      LATIN CAPITAL LETTER S
        3          4  000422   D0 A2          Т      CYRILLIC CAPITAL LETTER TE
        4          6  000045   45             E      LATIN CAPITAL LETTER E
        5          7  000052   52             R      LATIN CAPITAL LETTER R
        6          8  00002E   2E             .      FULL STOP
        7          9  000074   74             t      LATIN SMALL LETTER T
        8         10  000078   78             x      LATIN SMALL LETTER X
        9         11  000074   74             t      LATIN SMALL LETTER T
       10         12  00000A   0A                     LINE FEED (LF)

答案2

ugrep好吧,我在网上查了一下,找到了一行通过名称查找 unicode 字符 | commandlinefu.com;但这对我没什么帮助。

然后我看到codecs – 字符串编码和解码 - 本周 Python 模块,它确实有很多选项 - 但与 Unicode 字符名称关系不大。

所以最后我编写了一个小工具utfinfo.pl,它只接受标准输入:

...这给了我以下信息:

$ ls TΕSТER.txt | perl utfinfo.pl 
Got 10 uchars
Char: 'T' u: 84 [0x0054] b: 84 [0x54] n: LATIN CAPITAL LETTER T [Basic Latin]
Char: 'Ε' u: 917 [0x0395] b: 206,149 [0xCE,0x95] n: GREEK CAPITAL LETTER EPSILON [Greek and Coptic]
Char: 'S' u: 83 [0x0053] b: 83 [0x53] n: LATIN CAPITAL LETTER S [Basic Latin]
Char: 'Т' u: 1058 [0x0422] b: 208,162 [0xD0,0xA2] n: CYRILLIC CAPITAL LETTER TE [Cyrillic]
Char: 'E' u: 69 [0x0045] b: 69 [0x45] n: LATIN CAPITAL LETTER E [Basic Latin]
Char: 'R' u: 82 [0x0052] b: 82 [0x52] n: LATIN CAPITAL LETTER R [Basic Latin]
Char: '.' u: 46 [0x002E] b: 46 [0x2E] n: FULL STOP [Basic Latin]
Char: 't' u: 116 [0x0074] b: 116 [0x74] n: LATIN SMALL LETTER T [Basic Latin]
Char: 'x' u: 120 [0x0078] b: 120 [0x78] n: LATIN SMALL LETTER X [Basic Latin]
Char: 't' u: 116 [0x0074] b: 116 [0x74] n: LATIN SMALL LETTER T [Basic Latin]

...然后识别哪些字符不是“普通” ASCII 字符。

希望这对某人有帮助,
干杯!

答案3

让我们在外部 ASCII 字符上工作,例如:á 来自 á 的字节,

echo -n 'á' | xxd

来自 á 的 unicode

echo -en 'á' | iconv -f utf-8 -t UNICODEBIG | xxd -g 2

所以在你的文件名中我们有

echo -e "\x54\xCE\x95\x53\xD0\xA2\x45\x52\x2E\x74\x78\x74"  | iconv -f utf-8 -t UNICODEBIG | xxd -g 2

显示大写字母 E 的 unicode 是 \u0395,这似乎与 ASCII \x45 的符号绘制相同

相关内容