Grep 不符非 ASCII 字符

Grep 不符非 ASCII 字符

我發現了一個被認為是 UTF-8 編碼的文本文件的有問題的序列。奇怪的是 grep 似乎無法匹配這個非 ASCII 行。

$ iconv -f utf8 -t iso88591 corrupt_part.txt --output corrupt_part.txt.conv
iconv: illegal input sequence at position 8
$ cat corrupt_part.txt
Oberallg�u
$ grep -P -n '[^\x00-\x7F]' corrupt_part.txt
$ od -h corrupt_part.txt
0000000 624f 7265 6c61 676c 75e4 0a20
0000014

\xe4例如,ä在擴展 ASCII 集中也是如此。然而,過濾控制和可列印字元(ASCII 範圍) 上面的 grep 指令應該與該\xe4字元相符。為什麼我沒有得到任何 grep 輸出?

答案1

e4 75確實是非法的utf8序列。在utf8中,最高半位元組等於0xe的位元組引入了三位元組序列。該序列的第二個位元組不能是 0x75,因為第二個位元組的高位半位元組 (0x7) 不在 0x8 和 0xb 之間。

這解釋了為什麼 iconv 拒絕該檔案作為無效的 utf8。也許它已經是 iso8859-1 了?

有關 utf8 編碼的摘要,請參閱此維基百科表

至於你的 grep 問題,也許如果你指定 C/POSIX 語言環境,其中字元相當於位元組:

LC_ALL=C grep -P -n '[^\x00-\x7F]' corrupt_part.txt

使用舊的 Ubuntu 系統、GNU grep 和使用 en_US.UTF-8 語言環境的環境:

$ od -h bytes
0000000 624f 7265 6c61 676c 75e4 0a20
0000014
$ grep -P '[^\x00-\x7F]' bytes | od -h
0000000 624f 7265 6c61 676c 75e4 0a20
0000014
$ LC_ALL=C grep -P '[^\x00-\x7F]' bytes | od -h
0000000 624f 7265 6c61 676c 75e4 0a20
0000014

相關內容