tfl*_*tre 5 character-encoding od whitespace
通过查看文本文件的特定行(比如第 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
Run Code Online (Sandbox Code Playgroud)
但是八进制的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
Run Code Online (Sandbox Code Playgroud)
有关信息,原始文件采用 .xlsx ( Excel ) 格式。当我的计算机运行Xubuntu 时,我使用LibreOffice Calc (v5.1)打开它。然后,我将其保存为“文本 CSV”,其中“字符集 = Unicode (UTF-8)”和制表符作为字段分隔符:
$ file myfile.csv
myfile.csv: UTF-8 Unicode text
Run Code Online (Sandbox Code Playgroud)
Sté*_*las 17
它是 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
Run Code Online (Sandbox Code Playgroud)
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 编码算法的详细信息,请参阅维基百科。