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


84

我有一堆用utf-8编码的阿拉伯文,英文,俄文文件。尝试使用Perl脚本处理这些文件时,出现以下错误:

Malformed UTF-8 character (fatal)

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

反正有做吗?




4
什么是非UTF-8字符?格式正确的UTF-8字符串中的所有字符都是UTF-8(实际上是Unicode)字符!其中有些是UTF-8在几个连续字节编码....
巴西莱Starynkevitch

3
@BasileStarynkevitch:错误消息明确指出存在格式错误的UTF-8字符。这意味着出现了一个字节,该字节不能作为有效UTF-8文件的一部分出现。那不难;它可能是0xC0或0xC1字节,或者0xF5..0xFF,或者是字节有效的排序问题。
乔纳森·莱夫勒

Answers:


156

该命令:

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”之间
科林

1
便利您可以将Mac上的剪贴板中的内容这样做:pbpaste | iconv -f utf-8 -t -utf-8 -c | pbcopy。我还创建了一个带有全局快捷方式的Alfred工作流,该快捷方式用于通过定位来剥离所有特殊字符ascii
Lenar Hoyt 2014年

1
这产生了一个对我来说完全空白的文件。只想让所有人都知道这可能具有破坏性,并在对其运行之前备份其文件。
counterbeing

5
iconv -f utf-8 -t ascii//TRANSLIT解决了我的问题。它将卷曲的引号转换为直接的引号。
Panic

5
-o不同的输出文件
codaamok

0

您的方法必须逐个字节地读取,并且必须完全理解并欣赏字节的按字节构造的字符。最简单的方法是使用将只读取输出UTF-8字符的任何内容的编辑器。文本板是一种选择。


cygwin中没有iconv。在Windows / cygwin上有什么办法吗?我有一个很大的XML文件(超过100000行),需要去除无效字符。我不在乎有效的utf-8。我已经将notepad ++设置为utf-8,但是即使从那里保存它,我在XML解析器中仍然会出错
mljm

Windows上的ubuntu WSL附带iconv
Kat Lim Ruiz

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.