有一个上传过程,读取文件并使用 sqlldr 将数据上传到数据库。在 sqlldr 中处理文件时,我遇到了无效号码问题。发现文件是 UTF-16 格式,然后在 notepad++ 中转换为 UTF-8 格式,它开始工作正常。现在我正在尝试像下面这样系统地转换它。
iconv -f UTF-16 -t UTF-8 file_name >output_file_name
该文件可能具有不同的编码,因此我想在转换之前找到该文件的编码,然后根据该编码进行转换。类似于使用文件命令仅从下面读取 UTF-16,然后在 -f 选项中使用它。
bash-4.2$ file "/FILE_UPLOADS/Relationship (4).txt"
/FILE_UPLOADS/Relationship (4).txt: Little-endian UTF-16 Unicode text, with CRLF line terminators
我怎么做?
您可以使用
file -i
,它将返回文件的 MIME 编码。就像是:
另一种方法是使用更专用的工具,例如:
https
://gitlab.freedesktop.org/uchardet/uchardet 然后命令变得更简单
但是你需要安装它。
vim
能够自行自动检测一些文件编码并转换为 UTF-8,因此您可以尝试在ex
以下模式下处理文件:我们也只重写在
update
此过程中修改过的文件。当
file
说Little-endian UTF-16 Unicode text或使用--mime-encoding
utf-16le时,这意味着该文件以 UTF-16 编码,并带有一个表明它是 little endian 的 BOM。file
无法检测没有 BOM 的 UTF-16 文本文件(小端或大端)。对于 UTF-16 文本,它需要前两个字节为 0xff、0xfe(小端)或 0xfe 0xff(大端),然后检查前 64KiB 数据的其余部分是否看起来像文本(仅寻找 UTF -16 编码的 ASCII 控制字符,文本文件中不应出现)。
对于
iconv
,表示不带utf-16le
BOM的小端 UTF-16 ,而 utf-16 表示带 BOM 的 utf-16,无论是大端还是小端。因此,如果您使用 的输出
file -b --mime-encoding
作为from字符集 iniconv
,您最终将在输出中使用 UTF-8 编码的 BOM。在这里,您可能想要类似的东西:
如果这些是 Microsoft 文件,正如 CRLF 所建议的那样,您可能希望
dos2unix
使用iconv
.dos2unix
(至少当前版本)应该能够检测和 UTF-16 并转换为区域设置的字符集(LC_ALL=C.UTF-8 dos2unix
如果您希望输出为 UTF-8 而不管区域设置,请运行它)并将 CRLF 更改为 LF 并修复其他怪癖在微软文件中。