sda*_*aau 11 linux bash unicode command-line utf-8
我刚刚意识到我的系统上有一个文件;它通常列出:
$ 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
Run Code Online (Sandbox Code Playgroud)
...然而,它使一个软件崩溃,并出现与 UTF-8/Unicode 相关的错误。我真的很困惑,因为我不知道为什么这样的文件有问题;最后我记得检查lswith的输出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
Run Code Online (Sandbox Code Playgroud)
...嗯,显然有一些字节之间/而不是一些字母,所以我猜这是一个 Unicode 编码问题。我可以尝试回显字节以查看打印的内容:
$ echo -e "\x54\xCE\x95\x53\xD0\xA2\x45\x52\x2E\x74\x78\x74"
T?S?ER.txt
Run Code Online (Sandbox Code Playgroud)
...但我仍然无法分辨这些是哪些 - 如果有 - Unicode 字符。
那么是否有一个命令行工具,我可以在终端上检查一个字符串,并获取有关它的字符的 Unicode 信息?
rmi*_*sen 15
尝试使用 uniname,它是Debian 和 Ubuntu 系统上uniutils软件包的一部分。下面是一个 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)
Run Code Online (Sandbox Code Playgroud)
嗯,我在网上查了一下,ugrep在Look up a unicode character by name | 中找到了一个单行字。commandlinefu.com ; 但这对我没有多大帮助。
然后我看到了编解码器——字符串编码和解码——本周的 Python 模块,它确实有很多选项——但与 Unicode 字符名称没有太大关系。
所以最后我编写了一个小工具utfinfo.pl,它只接受 stdin 上的输入:
...这给了我以下信息:
$ 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]
Run Code Online (Sandbox Code Playgroud)
...然后确定哪些字符不是“普通”ASCII 字符。
希望这对某人
有所帮助,干杯!
| 归档时间: |
|
| 查看次数: |
10761 次 |
| 最近记录: |