Character-Encoding
八進制 302 240 一起似乎對應於不間斷的空間
通過查看文本文件的特定行(例如,第 1123 行,見下文),似乎有一個不間斷的空格,但我不確定:
$ cat myfile.csv | sed -n 1123p | cut -f2 Lisztes feher $ cat myfile.csv | sed -n 1123p | cut -f2 | od -An -c -b L i s z t e s 302 240 f e h e r \n 114 151 163 172 164 145 163 302 240 146 145 150 145 162 012
但是,八進制的ASCII 碼表示一個不間斷空格是 240。那麼 302 對應的是什麼?這個給定的文件有什麼特別的嗎?
我問這個問題是為了理解。按照這個答案,我已經知道如何使用
sed
來解決我的問題:$ cat myfile.csv | sed -n 1123p | cut -f2 | sed 's/\xC2\xA0/ /g' | od -An -c -b L i s z t e s f e h e r \n 114 151 163 172 164 145 163 040 146 145 150 145 162 012
有關資訊,原始文件採用 .xlsx ( Excel ) 格式。當我的電腦執行Xubuntu時,我使用LibreOffice Calc (v5.1)打開它。然後,我將其保存為“文本 CSV”,其中“字元集 = Unicode (UTF-8)”和選項卡作為欄位分隔符:
$ file myfile.csv myfile.csv: UTF-8 Unicode text
它是 U+00A0 Unicode 字元的 UTF-8 編碼:
$ unicode U+00A0 U+00A0 NO-BREAK SPACE UTF-8: c2 a0 UTF-16BE: 00a0 Decimal:   Octal: \0240 Category: Zs (Separator, Space) Bidi: CS (Common Number Separator) Decomposition: <noBreak> 0020 $ locale charmap UTF-8 $ printf '\ua0' | od -to1 0000000 302 240 0000002
UTF-8 是一種 Unicode 編碼,每個字元的字節數可變。Unicode 作為字元集是 iso8859-1(又名 latin1)的超集,它本身就是 ASCII 的超集。
而在 iso8859-1 中,不間斷空格字元(iso8859-1 中的程式碼點 0xa0,就像 Unicode 中一樣)將表示為一個 0xa0 字節,在 UTF-8 中,只有程式碼點 0 到 127 表示為一個字節(這使得 UTF-8 成為 ASCII 的超集,或者換句話說,ASCII 文件也是 UTF-8 文件)。
超過 128 的程式碼點被編碼為每個字元更多的字節。有關 UTF-8 編碼算法的詳細資訊,請參閱Wikipedia。