Cat
cat 如何處理點陣圖?
好奇心在這裡。我編了一個點陣圖,並希望它為文件中的每個字節顯示一個 ascii 字元。因此,前幾個字元與預期的一樣(BM6),但我進一步注意到它還在終端中顯示了非 ascii 字元,如“ڮ”、“Ѿ”、“ӷ”等。
為什麼是這樣?貓在這裡做什麼?
(我使用的點陣圖bitsPerPixel=8,所以不能代表多字節像素,對吧?)
它將它們寫入標準輸出。
接下來發生的事情取決於標準輸出是什麼。如果是終端設備,則行為由終端決定,與
cat
.當談到終端的行為時,有幾件事很重要:
- ASCII 是一種 7 位字元編碼。一個 8 位字節可以表示兩倍於 ASCII 字元集中的東西。其他 128 個值的含義是 1970 年代、1980 年代和 1990 年代反复討論的主題。我們有單字節編碼、雙字節編碼、程式碼頁、ISO 8859 以及 ASCII 本身的部分,這些部分旨在成為變體(或在標準的後續版本中發生變化)。這甚至不涉及 ISO 2022/ECMA-35 和可切換字元集的複雜性。有一個神話說那裡有一個“普通的 ASCII”世界。近半個世紀以來,情況並非如此。如今,您幾乎永遠不會遇到只查看實際 ASCII 的情況。
- 如今,終端仿真器很可能使用 UTF-8,這是一種 Unicode 的可變長度編碼,其中每個程式碼點是一個或多個字節。15 年前,它開始變得司空見慣。
- 即使您只使用 ASCII,有些字元是列印字元,終端將使用可列印的圖形呈現,而其他字元是控製字元,它們具有各種非列印效果(包括,在 ␀ 的情況下,在全部)。Unicode 更複雜,但實際上只有一些程式碼點可顯示的基本思想仍然大致正確。
- 終端根據它們目前設置使用的字元編碼將其接收到的字節流解碼為字元。這因終端而異。終端仿真器通常有一些菜單選項,使用者可以隨意更改此解碼。
在緊握的手上,通過將點陣圖列印到終端來查看點陣圖
cat
是瘋狂的。學習或hexdump
的樂趣。 根本不應該參與。od
cat