检测UTF-8编码的文本文件中的损坏字符

5
我有一个文本文件,由于错误的字符编码而出现了一些乱码和损坏的字符。当我使用UTF-8打开它时,有些字符串会出现这种情况。哪种脚本语言最有效地检测这些损坏的字符?Perl不是一个选项。我基本上想找到一种使用脚本扫描文本文件并输出发现损坏字符的行号和可能的偏移量的方法。我考虑使用AWk,但我不知道在搜索损坏的字符时要使用什么正则表达式。如果能指点一下方向,那就太好了。
更全面的输入:
我希望这个脚本告诉我哪一行有损坏的字符,以上面的例子为例,是第五行。此外,文本文件中有不同的语言,包括英语、中文、法语、西班牙语、俄语、葡萄牙语、土耳其语、欧洲法语、德语、荷兰语、佛兰芒语、韩语和葡萄牙语(Moz)。我还有一些特殊字符,如#、!和***。
我使用了以下if语句来得到上面的输出:
if($1 ~ /[^\x00-\x7F]/){
print NR ":" , $0 > "output.txt";
count++;
}

一些 Pythonic 的想法 - josifoski
@sln 我在if语句中使用了提供的正则表达式,它打印出了文件中所有文本行。 - user2056389
您的文本中没有无效的UTF-8字符。如果您在谈论扩展ASCII范围内的匹配字符,那么应该是这个[\x{80}-\x{FF}] - user557597
如果你在谈论转换语言代码点,那就是另一回事了。 - user557597
你改变了脚本,导致它出错了。Awk 是一系列 <condition> { <action> } 语句。我想象不出在条件周围加上 if() 会导致什么问题 - 也许它以为你有一个名为 if 的变量或函数,并尝试用测试结果进行字符串连接或其他操作...我真的不知道。但请不要这样做 - 使用发布的脚本。此外,请发布给定输入的预期输出,我们无法测试可能的解决方案而不知道输出应该是什么。 - Ed Morton
显示剩余5条评论
1个回答

3

这将找到所有ASCII范围之外的字符:

$ awk '/[^\x00-\x7F]/{ print NR ":", $0 }' file
1: Interruptor EC não está em DESLOCAR
4: 辅助驾驶室门关闭
5: Porte cab. aux. fermée
7: Дверь аппаратной камеры закрыта
13: 高压ä¿æŠ¤æ‰‹æŸ„å‘下
14: Barrière descendue
16: Огранич. Планка ВВК опущ.
19: Barra de separação descida
22: DP未å¯åŠ¨
23: Puiss. rép. non activée
25: !!! ВнешнÑÑ Ð¼Ð¾Ñ‰Ð½Ð¾ÑÑ‚ÑŒ не включена
26: Potência Dist Não Ativada
28: Potência dist não activada
31: 机车未移动
33: Motor no se está moviendo
34: Локомотив неподвижен
35: Auto Não se Movendo
37: A não se move
40: 机车状况å…许自动åœæœº
41: Conditions auto\npermettent arrêt auto
43: УÑтановки локомотива\nПредуÑматривают Ð     °Ð²Ñ‚оматичеÑкую оÑтановку
44: Condições da moto\nPermitem Auto Parada

这样足够好吗?如果不行,请修改您的问题,展示更全面的样例输入,包括上述方法无法处理的情况。


不幸的是,它没有按照我预期的方式工作。我在if语句中使用了它,就像这样:code if($1 ~ /[^\x00-\x7F]/) { print NR ":" , $0 > "output.txt"; count++; }code,并且它给出了上面的输出。 - user2056389
无法想象为什么您要这样搞乱脚本。千万不要这样做。我已经更新了我的答案,以展示脚本针对您的新样本输入运行。那是您想要的吗? - Ed Morton
非常感谢您的帮助。我尝试将 awk 命令放在 if 语句中的原因是脚本必须自动运行并检查文件夹中的多个文件,而不仅仅是手动检查一个特定文件。先生,您如何将那个 awk 单行命令转换为可执行脚本,以检查特定文件夹中的所有文件呢? - user2056389
只需将参数从“file”更改为“*”。 - Ed Morton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接