Wil*_*m R 13 command-line character-encoding
我有一个二进制字符集的 CSV 文件,但我必须转换为 UTF-8 才能在 HDFS (Hadoop) 中处理。
我使用以下命令来检查字符集。
file -bi filename.csv
Run Code Online (Sandbox Code Playgroud)
输出 :
application/octet-stream; charset=binary
Run Code Online (Sandbox Code Playgroud)
当我尝试将文件从二进制文件转换为 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.
Run Code Online (Sandbox Code Playgroud)
任何人都可以帮助我了解是否可以转换,我可以使用 head 命令查看数据。
这是什么意思,二进制表示不可读,但是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
Run Code Online (Sandbox Code Playgroud)
Tho*_*key 17
“二进制”不是编码(字符集名称)。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//
Run Code Online (Sandbox Code Playgroud)
“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
Run Code Online (Sandbox Code Playgroud)
假设 UTF-16LE,您可以使用
iconv -f UTF-16LE// -t UTF-8// <input >output
Run Code Online (Sandbox Code Playgroud)