Character-Encoding

八進制 302 240 一起似乎對應於不間斷的空間

  • April 27, 2021

通過查看文本文件的特定行(例如,第 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

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