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

dw8*_*547 11 byte-order-mark dos2unix utf-16

我通过选择Export-> Related files 从OECD http://stats.oecd.org/Index.aspx?datasetcode=CRS1("CRS 2013 data.txt')下载文件.我想在Ubuntu(14.04 LTS)中使用此文件.

当我跑:

dos2unix CRS\ 2013\ data.txt
Run Code Online (Sandbox Code Playgroud)

我知道了:

dos2unix: Binary symbol 0x0004 found at line 1703
dos2unix: Skipping binary file CRS 2013 data.txt
Run Code Online (Sandbox Code Playgroud)

我检查文件的编码:

file --mime-encoding CRS\ 2013\ data.txt
Run Code Online (Sandbox Code Playgroud)

并看到:

CRS 2013 data.txt: utf-16le
Run Code Online (Sandbox Code Playgroud)

我做:

iconv -l | grep utf-16le
Run Code Online (Sandbox Code Playgroud)

这不会返回任何东西,所以我这样做:

iconv -l | grep UTF-16LE
Run Code Online (Sandbox Code Playgroud)

返回:

UTF-16LE//
Run Code Online (Sandbox Code Playgroud)

然后我跑:

iconv --verbose -f UTF-16LE -t UTF-8 CRS\ 2013\ data.txt -o crs_2013_data_temp.txt
Run Code Online (Sandbox Code Playgroud)

并检查:

file --mime-encoding crs_2013_data_temp.txt
Run Code Online (Sandbox Code Playgroud)

并看到:

crs_2013_data_temp.txt: utf-8
Run Code Online (Sandbox Code Playgroud)

然后我尝试:

dos2unix crs_2013_data_temp.txt
Run Code Online (Sandbox Code Playgroud)

得到:

dos2unix: Binary symbol 0x04 found at line 1703
dos2unix: Skipping binary file crs_2013_data_temp.txt
Run Code Online (Sandbox Code Playgroud)

然后我试着强迫它:

dos2unix -f crs_2013_data_temp.txt
Run Code Online (Sandbox Code Playgroud)

它工作,即dos2unix完成转换而不会挽救/抱怨,但当我打开文件时,我看到像"FoÃ"Ťa和Ã"ÅšajniÃ"Ťe"这样的条目.

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

LTh*_*ode 5

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

不幸的是,由于文件是UTF-16 dos2unix,因此应用于tr文件以剥离回车的预处理将不起作用.iconv但是,既然适合您,您可以使用它转换为UTF-8(tr将继续使用),然后运行此tr命令:

tr -d '\r' < crs_2013_data_temp.txt > crs_2013_data_unix.txt
Run Code Online (Sandbox Code Playgroud)

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

tr -d '\004' < crs_2013_data_unix.txt > crs_2013_data_clean.txt
Run Code Online (Sandbox Code Playgroud)

摆脱它.

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