如何在乱码文件中查找双字符并用Unicode单字符替换?

如何在乱码文件中查找双字符并用Unicode单字符替换?

我有一个很长的法语文本文件需要清理。非 ASCII 字符已被替换为奇数字符的组合。例如,以下内容:

祝你生日快乐。

应该变成:(作为 Unicode 文本)

年底的快乐节日的经过者。

我尝试过 sed,但没有成功。一位朋友推荐尝试 Perl。我可以轻松地构建一个包含奇数字符序列和正确的替换字符的表。理想情况下,我希望该表成为一个独立文件以供将来使用。对于此类转换,推荐的方法是什么?

答案1

看起来你的文本是用 utf-8 编码的(这很好,因为它是 Unix 的标准),但随后有些东西将其读取为 ISO 8859-1 / Microsoft 的 windows Latin-1,然后输出其解释。你需要扭转这个局面。

例如

echo "passer de très bonnes fêtes de fin d'année" | iconv --to-code="ISO 8859-1"

这将获取损坏的编码,并将其转换为有效的 utf-8。如果您的系统配置为 utf-8,那么它将正确读取。

说明:如果我们这样做echo è | od -t x1echo ê | od -t x1,那么我们看到十六进制代码是c3 a8 0ac3 aa 0a,然后我们看这里http://www.ascii-code.com/(这些是 iso 8859-1 代码,而不是 ascii )我们看到这些代码给出了è和 ,ê后面都跟着一个不可见的字符。现在我们知道出了什么问题:读取的是 utf-8,但将其解释为 iso 8859-1。所以我们现在需要反转它:我们以我们正在读取的任何格式读取,并转换为 iso 8859-1(与我们这里的格式相反)。结果是有效的 utf-8。

答案2

原帖者呈现的mojibake可能有两个原因:

  1. 该文件包含 UTF 格式的法语文本,但显示该文件的程序错误地采用 ISO 8859-1 或 Windows-1252 编码(而不是 UTF-8)。
  2. 双编码:基本上是理查德告诉的事情。

解决方案是:

  1. 由具有 UTF-8 语言环境的应用程序读取。
  2. 尝试iconf -f UTF-8 -t Windows-1252 <垃圾文件          或者iconf -f UTF-8 -t ISO-8859-1 <垃圾文件      ,期望输出上有有意义的 UTF-8 文本。

不过,文本有可能被进一步损坏(对于专家来说:例如 U+00C7 Ç,UTF 编码为\303\207,在 ISO-8859-1 中使用 C1 控制代码读取,已被删除)并且自动转换回不再可能了。那么是的,自动搜索和替换(参见理查德的答案下的评论)可以恢复至少一些原始字符。

相关内容