dos2unix:在第1703行找到的二进制符号0x04

时间:2015-04-28 15:11:16

标签: utf-16 byte-order-mark dos2unix

我通过选择导出 - >从OECD http://stats.oecd.org/Index.aspx?datasetcode=CRS1('CRS 2013 data.txt')下载文件。相关文件。我想在Ubuntu(14.04 LTS)中使用这个文件。

当我跑步时:

dos2unix CRS\ 2013\ data.txt

我明白了:

dos2unix: Binary symbol 0x0004 found at line 1703
dos2unix: Skipping binary file CRS 2013 data.txt

我用以下方法检查文件的编码:

file --mime-encoding CRS\ 2013\ data.txt

并看到:

CRS 2013 data.txt: utf-16le

我做:

iconv -l | grep utf-16le

这不会返回任何内容,所以我这样做:

iconv -l | grep UTF-16LE

返回:

UTF-16LE//

然后我跑:

iconv --verbose -f UTF-16LE -t UTF-8 CRS\ 2013\ data.txt -o crs_2013_data_temp.txt

并检查:

file --mime-encoding crs_2013_data_temp.txt

并看到:

crs_2013_data_temp.txt: utf-8

然后我尝试:

dos2unix crs_2013_data_temp.txt

并获得:

dos2unix: Binary symbol 0x04 found at line 1703
dos2unix: Skipping binary file crs_2013_data_temp.txt

然后我试着强迫它:

dos2unix -f crs_2013_data_temp.txt

它有效,即dos2unix完成转换而不会挽救/抱怨但是当我打开文件时,我看到像“FoÔŤa和ÓŚajniÔŤe“这样的条目。

我的问题是为什么?是因为dos2unix看不到BOM吗?因为它丢失了? 我没有完成转换吗? 如何转换此文件(正确?)以便我可以阅读它。

3 个答案:

答案 0 :(得分:5)

您在文件中看到的0x0004字符与BOM没有任何关系(顺便说一句,这很好) - 它是来自C0控件集的EOT(传输结束)字符,并且已经存在在那个代码点,因为7位ASCII是新的热点。 (它也是熟悉的Control-D Unix EOF序列。)

不幸的是,将dos2unix应用于文件以剥离回车符的前tr方式将不会直接起作用,因为该文件是UTF-16;但是,由于iconv适用于您,您可以使用它转换为UTF-8(tr将继续使用),然后运行此tr命令:

tr -d '\r' < crs_2013_data_temp.txt > crs_2013_data_unix.txt

为了使文本文件进入Unix行结束约定。但是,您必须密切关注要为文件提供的任何工具,以确保他们不会阻塞Ctrl-D / EOT字符;如果他们这样做,你可以使用

tr -d '\004' < crs_2013_data_unix.txt > crs_2013_data_clean.txt

摆脱它。

首先它是如何到达那里的?我责怪比利时人让他们偷偷摸摸他们给经合组织的数据,他们可能用cat - > file或其他类似的平庸手段加入。此外,一些文本编辑通过隐藏控制字符试图有点太有用,即使其他工具在看到它们时会挽救,因为他们认为你只是填充了一段时间内假装是文本的二进制文件。

答案 1 :(得分:1)

我认为这个命令可以解决你的问题:

cat file | tr -d "\r" > new_file

答案 2 :(得分:0)

这就是我解决的方法:

find . -type f -exec sed -i 's/\r//' {} \;