Cat
cat -v
用於非列印非 ascii UTF 字元
cat
有一個-v
將非列印字元轉換為插入符號的選項(如果我們不希望終端在cat
輸出中逐字解釋控製字元,這很有用)。但據我了解,插入符號僅適用於 ASCII 字母表中的非列印字元。那麼 UTF 中不屬於 ASCII 的非列印字元(例如https://www.compart.com/en/unicode/category/Cc)呢?將使用什麼符號
cat -v
來顯示這些?
我們可以生成一個包含前 256 個 UTF-8 Unicode 字元的文件:
python3 -c 'for x in range(0,255): print(chr(x), end="")' > unicode-file
這包括 Latin-1 Supplement 中的非 ASCII (C1) 控制項,以及大量列印字元。
現在我們可以
cat -v
了:^@^A^B^C^D^E^F^G^H ^K^L^M^N^O^P^Q^R^S^T^U^V^W^X^Y^Z^[^\^]^^^_ !"#$%&'()*+,-./0123456789:; <=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~^? M-BM-^@M-BM-^AM-BM-^BM-BM-^CM-BM-^DM-BM-^EM-BM-^FM-BM-^GM-BM-^HM-BM-^I M-BM-^JM-BM-^KM-BM-^LM-BM-^MM-BM-^NM-BM-^OM-BM-^PM-BM-^QM-BM-^RM-BM-^S M-BM-^TM-BM-^UM-BM-^VM-BM-^WM-BM-^XM-BM-^YM-BM-^ZM-BM-^[M-BM-^\M-BM-^] M-BM-^^M-BM-^_M-BM- M-BM-!M-BM-"M-BM-#M-BM-$M-BM-%M-BM-&M-BM-'M-BM-(M-B M-)M-BM-*M-BM-+M-BM-,M-BM--M-BM-.M-BM-/M-BM-0M-BM-1M-BM-2M-BM-3M-BM-4M-B M-5M-BM-6M-BM-7M-BM-8M-BM-9M-BM-:M-BM-;M-BM-<M-BM-=M-BM->M-BM-?M-CM-^@ M-CM-^AM-CM-^BM-CM-^CM-CM-^DM-CM-^EM-CM-^FM-CM-^GM-CM-^HM-CM-^IM-CM-^J M-CM-^KM-CM-^LM-CM-^MM-CM-^NM-CM-^OM-CM-^PM-CM-^QM-CM-^RM-CM-^SM-CM-^T M-CM-^UM-CM-^VM-CM-^WM-CM-^XM-CM-^YM-CM-^ZM-CM-^[M-CM-^\M-CM-^]M-CM-^^ M-CM-^_M-CM- M-CM-!M-CM-"M-CM-#M-CM-$M-CM-%M-CM-&M-CM-'M-CM-(M-CM-)M-C M-*M-CM-+M-CM-,M-CM--M-CM-.M-CM-/M-CM-0M-CM-1M-CM-2M-CM-3M-CM-4M-CM-5M-C M-6M-CM-7M-CM-8M-CM-9M-CM-:M-CM-;M-CM-<M-CM-=M-CM->
(我已經手動包裝了它以便閱讀)
你可以看到它在第四行的開頭表示 U+0080 ,也就是 UTF-8
C2 80
,如M-BM-^@
.M-B
代表C2字節:B為0x42,所以M-
代表設置高位(即加0x80)。M-^@
對空字節(meta-ctrl-@)做同樣的事情 -M-x
和^x
符號組合在一起。所有非 ASCII 碼位都會發生同樣的情況,這些碼位將完全由 UTF-8 中的高字節或任何其他編碼中的所有字節 128-255 組成。不同
cat
的實現可能有自己的行為,因為-v
這不是標準cat
選項,但 GNU cat 和常見的 BSD 版本都以這種方式執行。