Command-Line

將 head 和 Notepad 可以讀取的二進制編碼轉換為 UTF-8

  • June 4, 2021

我有一個二進製字元集的 CSV 文件,但我必須轉換為 UTF-8 才能在 HDFS (Hadoop) 中處理。

我使用以下命令檢查字元集。

file -bi filename.csv

輸出 :

application/octet-stream; charset=binary

當我嘗試將文件從二進制轉換為 UTF-8 時,它會引發錯誤。

iconv -f binary -t utf-8 fiename.csv
iconv: conversion from binary' is not supported
Try iconv --help' or iconv --usage' for more information.

誰能幫我理解是否可以轉換,我可以使用 head 命令查看數據。

這是什麼意思,二進制意味著不可讀,但是頭命令或記事本如何讀取數據。

od -tc < 文件名.csv | 頭

0000000 357 273 277   |   |   R   e   q   u   e   s   t   _   I   D   #
0000020   D   #   T   y   p   e   #   D   #   S   u   b   m   i   t   t
0000040   e   r   #   D   #   S   h   o   r   t   _   D   e   s   c   r
0000060   i   p   t   i   o   n   #   D   #   L   o   g   _   T   e   x
0000100   t   #   D   #   S   t   a   t   u   s   #   D   #   A   s   s
0000120   i   g   n   e   d   _   T   o   #   D   #   A   s   s   i   g
0000140   n   e   e   #   D   #   C   r   e   a   t   e   _   D   a   t
0000160   e   #   D   #   F   o   r   w   T   o   E   x   t   H   D   #
0000200   D   #   L   a   s   t   _   M   o   d   i   f   i   e   d   _
0000220   B   y   #   D   #   L   o   g   _   I   D   #   D   #   L   o

“二進制”不是編碼(字元集名稱)。iconv 需要一個編碼名稱來完成它的工作。

file實用程序在無法辨識文件格式時不會提供有用的資訊。UTF-16例如, 它可能沒有字節編碼標記 (BOM)。notepad讀到。這同樣適用於UTF-8(並且head會顯示*,*因為您的終端可能設置為 UTF-8 編碼,並且它不會關心 BOM)。

如果文件是 UTF-16,您的終端將顯示該使用,head因為大多數字元將是 ASCII(甚至是 Latin-1),使 UTF-16 字元的“其他”字節為空。

在任何一種情況下,缺少 BOM 都會(取決於 的版本file)混淆它。但其他程序可能會起作用,因為這些文件格式可以與 Microsoft Windows 以及可以在 Windows 上執行的攜帶式應用程序一起使用。

要將文件轉換為 UTF-8,您必須知道它使用哪種編碼,以及該編碼的名稱與iconv. 如果它已經是 UTF-8,那麼是否添加 BOM(在開頭)是可選的。UTF-16 有兩種風格,根據哪個字節在前。或者您甚至可以使用 UTF-32。 iconv -l列出這些:

ISO-10646/UTF-8/
ISO-10646/UTF8/
UTF-7//
UTF-8//
UTF-16//
UTF-16BE//
UTF-16LE//
UTF-32//
UTF-32BE//
UTF-32LE//
UTF7//
UTF8//
UTF16//
UTF16BE//
UTF16LE//
UTF32//
UTF32BE//
UTF32LE//

“LE”和“BE”指的是字節序的小端和大端。Windows 使用“LE”風格,並且iconv可能假設缺少“LE”或“BE”的風格。

您可以使用八進制(原文如此)轉儲來查看:

$ od -bc big-end
0000000 000 124 000 150 000 165 000 040 000 101 000 165 000 147 000 040
        \0   T  \0   h  \0   u  \0      \0   A  \0   u  \0   g  \0    
0000020 000 061 000 070 000 040 000 060 000 065 000 072 000 060 000 061
        \0   1  \0   8  \0      \0   0  \0   5  \0   :  \0   0  \0   1
0000040 000 072 000 065 000 067 000 040 000 105 000 104 000 124 000 040
        \0   :  \0   5  \0   7  \0      \0   E  \0   D  \0   T  \0    
0000060 000 062 000 060 000 061 000 066 000 012
        \0   2  \0   0  \0   1  \0   6  \0  \n
0000072

$ od -bc little-end
0000000 124 000 150 000 165 000 040 000 101 000 165 000 147 000 040 000
         T  \0   h  \0   u  \0      \0   A  \0   u  \0   g  \0      \0
0000020 061 000 070 000 040 000 060 000 065 000 072 000 060 000 061 000
         1  \0   8  \0      \0   0  \0   5  \0   :  \0   0  \0   1  \0
0000040 072 000 065 000 067 000 040 000 105 000 104 000 124 000 040 000
         :  \0   5  \0   7  \0      \0   E  \0   D  \0   T  \0      \0
0000060 062 000 060 000 061 000 066 000 012 000
         2  \0   0  \0   1  \0   6  \0  \n  \0
0000072

假設 UTF-16LE,你可以使用轉換

iconv -f UTF-16LE// -t UTF-8// &lt;input &gt;output

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