删除文本文件中包含编码错误的行

时间:2013-10-02 12:02:51

标签: text encoding utf-8 grep

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

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

您对我如何做到这一点有什么想法吗?

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

2 个答案:

答案 0 :(得分:2)

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

  1. 文件是否真的编码在X中? (X在你的情况下是没有BOM的UTF-8。你可能试图用UTF-8读取UTF-8 WITH BOM,UTF-16,latin-1等,这就是问题所在) 。尝试阅读(不转换为)其他编码,看看它们是否适合。

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

  3. 我喜欢notepad++ for windows(在linux中使用wine也完​​美运行)让你设置你想要读取文件的任何编码而不试图转换它(当然如果你设置的除了一个以外)文件编码在你只能看到那些奇怪的字符),并且还有一个不同的选项,允许你将它从一种编码转换为另一种编码。这对我来说非常有用。

    如果您是初学者,可能会对此article感兴趣。它简要而清楚地解释了字符编码的内容,原因和方法。

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

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

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

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

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

答案 1 :(得分:1)

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

perl -pe 's/[^[:ascii:]]+//g;' my_utf8_file.txt