dos2unix:在第 1703 行找到二进制符号 0x04
dos2unix: Binary symbol 0x04 found at line 1703
我通过选择“导出”->“相关文件”从 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
这没有 return 任何东西所以我做了:
iconv -l | grep UTF-16LE
其中 return 个:
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 完成了转换而没有 bailing out/complaining 但是当我打开文件时我看到像 "FoÄŤa and ÄŚajniÄŤe".
这样的条目
我的问题是为什么?是因为BOM对dos2unix不可见吗?因为不见了?
我没有做正确的转换吗?
如何(正确地?)转换此文件以便我可以阅读它。
您在文件中看到的 0x0004 字符与 BOM 完全无关(顺便说一下,这很好)——它是 C0 控制集中的 EOT(传输结束)字符,并且自从 7 位 ASCII 成为新热点以来,它就一直处于该代码点。 (这也是熟悉的 Control-D Unix EOF 序列。)
不幸的是,dos2unix
之前的方法将 tr
应用于文件以去除回车符 returns 将无法直接工作,因为文件是 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 '[=11=]4' < crs_2013_data_unix.txt > crs_2013_data_clean.txt
摆脱它。
至于它最初是如何到达那里的?我责怪比利时人让它潜入他们提供给经合组织的数据中,他们可能使用 cat - > file
或其他类似的令人印象深刻的方式输入这些数据。此外,一些文本编辑器试图通过隐藏控制字符来提供一些帮助,即使其他工具在看到它们时会退出,因为它们认为您只是将一个二进制文件塞进了一段时间,该文件假装是文本。
我认为这个命令可以解决你的问题:
cat file | tr -d "\r" > new_file
我就是这样解决的:
find . -type f -exec sed -i 's/\r//' {} \;
我通过选择“导出”->“相关文件”从 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
这没有 return 任何东西所以我做了:
iconv -l | grep UTF-16LE
其中 return 个:
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 完成了转换而没有 bailing out/complaining 但是当我打开文件时我看到像 "FoÄŤa and ÄŚajniÄŤe".
这样的条目我的问题是为什么?是因为BOM对dos2unix不可见吗?因为不见了? 我没有做正确的转换吗? 如何(正确地?)转换此文件以便我可以阅读它。
您在文件中看到的 0x0004 字符与 BOM 完全无关(顺便说一下,这很好)——它是 C0 控制集中的 EOT(传输结束)字符,并且自从 7 位 ASCII 成为新热点以来,它就一直处于该代码点。 (这也是熟悉的 Control-D Unix EOF 序列。)
不幸的是,dos2unix
之前的方法将 tr
应用于文件以去除回车符 returns 将无法直接工作,因为文件是 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 '[=11=]4' < crs_2013_data_unix.txt > crs_2013_data_clean.txt
摆脱它。
至于它最初是如何到达那里的?我责怪比利时人让它潜入他们提供给经合组织的数据中,他们可能使用 cat - > file
或其他类似的令人印象深刻的方式输入这些数据。此外,一些文本编辑器试图通过隐藏控制字符来提供一些帮助,即使其他工具在看到它们时会退出,因为它们认为您只是将一个二进制文件塞进了一段时间,该文件假装是文本。
我认为这个命令可以解决你的问题:
cat file | tr -d "\r" > new_file
我就是这样解决的:
find . -type f -exec sed -i 's/\r//' {} \;