字節和字元(至少 *nixwise)有什麼區別?
我了解任何字元都由一個或多個字節組成。
如果我沒記錯的話,至少在 *nix 作業系統中,一個字元通常(或完全?)僅由一個字節組成。
字節和字元(至少 *nixwise)有什麼區別?
按照慣例和POSIX 定義,一個字節是八位。位是二進制數字(即基本數字
1
或0
幾乎所有數字計算的基礎)。一個字元通常是一個字節,在某些情況下(例如 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
和ö
.