web-dev-qa-db-ja.com

Octals 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

ただし、8進数の ASCIIコード は、改行なしスペースが240であることを示します。302は何に対応していますか?これはこの特定のファイルに固有のものですか?

理解するために質問をしています。私はすでにsedを使用して問題を解決する方法を知っています。これは answer に従います:

$ 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 )形式です。私のコンピューターは Xubunt を実行しているので、 LibreOffice Calc(v5.1)で開きました。次に、「文字セット= Unicode(UTF-8)」とフィールド区切り記号としてタブを使用して、「テキストCSV」として保存しました。

$ file myfile.csv
myfile.csv: UTF-8 Unicode text
4
tflutre

これは、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では、非改行文字(Unicodeのようにiso8859-1のコードポイント0xa0)は1つの0xa0バイトとして表現されますが、UTF-8では、コードポイント0〜127のみが1バイトとして表現されます(これにより、UTF-8はASCIIまたは言い換えればASCIIファイルもUTF-8ファイルです)のスーパーセットになります。

128を超えるコードポイントは、文字あたりのバイト数が多くなるようにエンコードされます。 UTF-8エンコードアルゴリズムの詳細については Wikipedia を参照してください。

15