1

我必须警告你我是初学者。我有一个文本文件,其中一些行包含编码错误。通过“错误”,这是我在我的 linux 控制台中解析文件时得到的(问号而不是字符):

编码错误 我想删除显示那些“问号”的每一行。我试图 grep -v 有问题的字符,但它不起作用。该文件本身是 UTF8,我猜有些行来自以另一种格式编码的文本。我知道我可以找到一种方法来正确地重新转换它们,但我现在只想让它们消失。

你对我怎么能做到这一点有什么想法吗?

PS:有些行包含显示正常的变音符号。“字符串”命令似乎删除了太多“好”行。

4

2 回答 2

2

在 ANSI 以外的字符编码上处理mojibake时,您必须检查 2 件事:

  1. 文件真的编码了X吗?(X在您的情况下是没有 BOM 的 UTF-8。您可能会尝试将 UTF-8 WITH BOM、UTF-16、latin-1 等读取为 UTF-8,这将是问题所在)。尝试读入(不转换为)其他编码,看看它们是否适合。

  2. 您的语言环境或文本编辑器是否设置为以 UTF-8 格式读取文件?如果不是,那可能就是问题所在。检查支持并找出如何更改设置。在 linux 中尝试使用localesetlocale命令来检查并正确设置它。

我喜欢notepad++ for windows(也可以在linux中使用wine完美运行)让你设置任何你想读取文件的编码而不尝试转换它(当然,如果你设置的不是文件编码的那个,你会只能看到那些奇怪的字符),并且还有一个不同的选项,允许您将其从一种编码转换为另一种编码。这对我很有用。

如果您是初学者,您可能会对这篇文章感兴趣。它简要而清晰地解释了字符编码的内容、原因和方式。

[编辑]如果上述方法失败,即使是 windows-1252 和此类 ANSI 编码,我刚刚在这里学习了如何使用 unix 命令删除非 ascii 字符tr,将其转换为 ASCII(但请注意额外字符的信息在此丢失输出并且没有返回,所以保留输入文件以防万一你找到更好的修复):

 tr -cd '\11\12\40-\176' < $INPUT_FILE > $OUTPUT_FILE

或者,如果您想摆脱整行:

 grep -v -P "[^\11\12\40-\176]" $INPUT_FILE > $OUTPUT_FILE

[编辑 2]这个答案很好地猜测了如果您的文件没有任何编码工作可能会发生什么(不幸的是,唯一直接的解决方案似乎是删除那些有问题的字符)

于 2013-10-02T12:16:13.907 回答
1

您可以使用 micro-Perl 脚本,例如:

perl -pe 's/[^[:ascii:]]+//g;' my_utf8_file.txt
于 2013-10-02T12:26:23.113 回答