Escape-Characters

字節和字元(至少 *nixwise)有什麼區別?

  • February 24, 2021

我了解任何字元都由一個或多個字節組成。

如果我沒記錯的話,至少在 *nix 作業系統中,一個字元通常(或完全?)僅由一個字節組成。

字節和字元(至少 *nixwise)有什麼區別?

按照慣例和POSIX 定義,一個字節是八位。位是二進制數字(即基本數字10幾乎所有數字計算的基礎)。

一個字元通常是一個字節,在某些情況下(例如 ASCII)可以定義為一個字節的長度。但是,Unicode 和 UTF-8 和 UTF-16 定義了擴展字元集,其中單個字元(或字形)可以由長度超過一個字節的數據有效負載定義。

單個字元:

Q̴̢̪̘̳̣̞̩̪̑̍̉̆̉͛̑̂̕͝

是單個字元,但它是通過將多個重音符號(或變音符號)應用到基本字形(簡單的Q. 這種編碼的長度比一個字節多得多:僅將該字元放入文件中並使用hexdump而不是cat在我的語言環境中顯示內容會產生:

$ hexdump -C demo
00000000  51 cc b4 cc 91 cc 8d cc  89 cc 86 cc 89 cd 9d cd  |Q...............|
00000010  9b cc 91 cc 95 cc 82 cc  aa cc 98 cc b3 cc a3 cc  |................|
00000020  a2 cc 9e cc a9 cc aa 0a                           |........|
00000028

POSIXly,強調我的:

3.87 字元代表單個圖形符號或控制程式碼的一個或多個字節

序列。

實際上,確切的含義取決於有效的語言環境,例如在“C”語言環境下,printf '\xc3\xa4\xc3\xb6' |wc -m給出 4,因為它有效地計算字節數;而在給出 2 的 UTF-8 語言環境下,因為那是兩個 UTF-8 編碼字元äö。假設您的終端也設置為 UTF-8,您當然可以只寫printf 'äö'.

(請注意,它wc -c被定義為計算字節數,而不是字元數,這很令人困惑。)

更糟糕的是,字元支持還取決於實用程序,並不是所有東西都能乾淨地處理多字節字元(更不用說 Unicode 的所有怪癖了)。例如 GNU tr 處理字節,不管它的手冊頁說什麼:

$ printf ä | tr ä xy; echo
xx
$ printf ö | tr ä xy; echo
x�

第一個與 相同tr '\303\244' 'xy',因此兩個字節都ä被替換,第二個發生是因為兩者的第一個字節äö相同的。當然,如果它真的處理字元,那些應該列印xö.

引用自:https://unix.stackexchange.com/questions/636021