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

标签 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?因为不见了?
我没有做正确的转换吗?
如何转换此文件(正确?)以便我可以阅读它。

最佳答案

您在文件中看到的 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 输入了这些数据。或其他一些类似的平淡无奇的手段。此外,一些文本编辑器试图通过隐藏控制字符来提供一点帮助,即使其他工具在看到它们时会退出,因为他们认为您只是在其中填充了一个伪装成文本一段时间的二进制文件。

关于utf-16 - dos2unix:在第 1703 行找到的二进制符号 0x04,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29923172/

相关文章:

text - UTF-8 字符串总是比 UTF-16 短吗?

unicode - 代理对是表示 UTF-16 中大于 2 个字节的代码点的唯一方法吗?

Java:比较字符串

linux - 如何从 UTF-8 文件中删除 BOM?

windows - 在 Windows 中对 500k 行文件执行 dos2unix 的最佳方法是什么?

java - 如何对包含 4 个字节字符的字符串进行子字符串化?

c++ - UTF-16BE 到 UTF-8 使用 Boost.Locale 产生垃圾

python - 从列表中的对象中删除字节顺序标记

c++ - C++程序添加^ M个字符

java - ant 中的 unix2dos(或 dos2unix)