將 head 和 Notepad 可以讀取的二進制編碼轉換為 UTF-8
我有一個二進製字元集的 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// <input >output