如何从文本文件中删除非 UTF-8 字符。

96

我有一堆阿拉伯语、英语和俄语文件,它们的编码是utf-8。当我尝试使用Perl脚本处理这些文件时,我收到了以下错误信息:

Malformed UTF-8 character (fatal)

我手动检查了这些文件的内容,发现其中有一些奇怪的字符。现在我正在寻找一种自动从文件中删除这些字符的方法。

有没有什么办法可以做到呢?


2
也许与这个链接相同:http://stackoverflow.com/questions/7656283/malformed-utf-8-character-fatal-error-while-parsing-xml-using-xmllibxml - Olaf Dietsche
2
请参考此链接: http://unix.stackexchange.com/questions/6516/filtering-invalid-utf8 - askmish
4
什么是非UTF-8字符?在格式良好的UTF-8字符串中,所有字符都是UTF-8(实际上是Unicode)字符!它们中的一些被UTF-8编码为几个连续的字节…… - Basile Starynkevitch
3
错误信息明确指出存在格式错误的 UTF-8 字符。这意味着一个字节出现了,而该字节不能作为有效的 UTF-8 文件的一部分出现。这并不难;它可能是一个 0xC0 或 0xC1 字节,或者是 0xF5..0xFF,或者是字节序列问题,导致本来可以是有效的字节变得无效。 - Jonathan Leffler
4个回答

183

这个命令:

iconv -f utf-8 -t utf-8 -c file.txt

该工具将清理您的UTF-8文件,跳过所有无效字符。

-f is the source format
-t the target format
-c skips any invalid sequence

11
在Mac上使用"iconv -f utf-8 -t utf-8 -c file.txt"命令。注意,'f'和'8'之间有连字符。 - Colin
1
在 Mac 上,你可以方便地转换剪贴板的内容,方法如下:pbpaste | iconv -f utf-8 -t -utf-8 -c | pbcopy。我还创建了一个 Alfred 工作流,其中包括一个全局快捷键,用于通过目标为 ascii 来去除所有特殊字符。 - Lenar Hoyt
1
这对我产生了一个完全空白的文件。只想让大家知道,这可能是有破坏性的,请在运行此操作之前备份文件。 - counterbeing
8
iconv -f utf-8 -t ascii//TRANSLIT解决了我的问题。它将卷曲引号转换为直引号。 - Colonel Panic
6
-o 用于指定不同的输出文件。 - codaamok
显示剩余4条评论

0

iconv可以做到

iconv -f cp1252 foo.txt

0

你的方法必须逐字节读取,并完全理解和欣赏字符的逐字节构造。最简单的方法是使用一个编辑器,它可以读取任何内容,但只输出UTF-8字符。Textpad是其中之一。


iconv在cygwin中不可用。在Windows / cygwin上有没有任何方法可以做到这一点?我有一个大的(100000+行)XML文件,需要剥离无效字符。我不关心有效的utf-8。我已将notepad ++设置为utf-8,但即使从那里保存它,我仍然在XML解析器中遇到错误。 - mljm
Ubuntu WSL在Windows上,它带有iconv图标。 - Kat Lim Ruiz

0

这里或其他类似问题的方法都对我无效。最终有效的方式是在 Sublime Text 2 中打开文件。转到“文件”>“使用编码重新打开”>“UTF-8”。将整个文件内容复制到新文件中并保存。

可能不是预期的解决方案,但我在这里分享以帮助任何需要的人,因为我已经苦苦挣扎了数小时。


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