我有一个很长的法语文本文件需要清理。非 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 x1
和echo ê | od -t x1
,那么我们看到十六进制代码是c3 a8 0a
和c3 aa 0a
,然后我们看这里http://www.ascii-code.com/(这些是 iso 8859-1 代码,而不是 ascii )我们看到这些代码给出了è
和 ,ê
后面都跟着一个不可见的字符。现在我们知道出了什么问题:读取的是 utf-8,但将其解释为 iso 8859-1。所以我们现在需要反转它:我们以我们正在读取的任何格式读取,并转换为 iso 8859-1(与我们这里的格式相反)。结果是有效的 utf-8。
答案2
原帖者呈现的mojibake可能有两个原因:
- 该文件包含 UTF 格式的法语文本,但显示该文件的程序错误地采用 ISO 8859-1 或 Windows-1252 编码(而不是 UTF-8)。
- 双编码:基本上是理查德告诉的事情。
解决方案是:
- 由具有 UTF-8 语言环境的应用程序读取。
- 尝试
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 控制代码读取,已被删除)并且自动转换回不再可能了。那么是的,自动搜索和替换(参见理查德的答案下的评论)可以恢复至少一些原始字符。