从字符串中删除每个非 utf-8 符号

Posted

技术标签:

【中文标题】从字符串中删除每个非 utf-8 符号【英文标题】:Delete every non utf-8 symbols from string 【发布时间】:2014-12-19 22:34:05 【问题描述】:

我有大量的文件和解析器。我要做的是剥离所有非 utf-8 符号并将数据放入 mongodb。 目前我有这样的代码。

with open(fname, "r") as fp:
    for line in fp:
        line = line.strip()
        line = line.decode('utf-8', 'ignore')
        line = line.encode('utf-8', 'ignore')

不知何故我仍然得到一个错误

bson.errors.InvalidStringData: strings in documents must be valid UTF-8: 
1/b62010montecassianomcir\xe2\x86\x90ta0\xe2\x86\x90008923304320733/290066010401040101506055soccorin

我不明白。有什么简单的方法吗?

UPD:似乎 Python 和 Mongo 不同意 Utf-8 有效字符串的定义。

【问题讨论】:

在我的头脑中,解析算法不是很重要,终点在前几行。也许我错了 【参考方案1】:
with open(fname, "r") as fp:
for line in fp:
    line = line.strip()
    line = line.decode('cp1252').encode('utf-8')

【讨论】:

如果原始输入编码实际上不是代码页 1252,这将是非常错误的。您删除了错误,但产生了垃圾。该错误是有原因的,以防止您产生垃圾。【参考方案2】:

对于 python 3,正如该线程的评论中所述,您可以这样做:

line = bytes(line, 'utf-8').decode('utf-8', 'ignore')

'ignore' 参数可防止在任何字符无法解码时引发错误。

如果您的行已经是字节对象(例如b'my string'),那么您只需要使用decode('utf-8', 'ignore') 对其进行解码。

【讨论】:

但是如果line在py3中已经是`str`,是否允许非utf8?【参考方案3】:

不处理 utf-8 字符的示例

import string

test=u"\n\n\n\n\n\n\n\n\n\n\n\n\n\nHi <<First Name>>\nthis is filler text \xa325 more filler.\nadditilnal filler.\n\nyet more\xa0still more\xa0filler.\n\n\xa0\n\n\n\n\nmore\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nfiller.\x03\n\t\t\t\t\t\t    almost there \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nthe end\n\n\n\n\n\n\n\n\n\n\n\n\n"

print ''.join(x for x in test if x in string.printable)

【讨论】:

这会删除所有非 ascii 字符,其中包括许多有效的 UTF-8 字符【参考方案4】:

试试下面的代码行而不是最后两行。希望对您有所帮助:

line=line.decode('utf-8','ignore').encode("utf-8")

【讨论】:

我有一些只在插入后才出现的不可见字符。有什么解决办法吗? @user168983 你能举个例子吗 this line.decode('utf-8','ignore').encode("utf-8") 产生此错误 AttributeError: 'str' object has no attribute 'decode',我使用 python3 @ChediBechikh 这是你在 python3 中的做法bytes(line, 'utf-8').decode('utf-8','ignore') 这似乎不起作用。我得到了很多特殊字符:\00\00\00\00\00

以上是关于从字符串中删除每个非 utf-8 符号的主要内容,如果未能解决你的问题,请参考以下文章

使用声明的 encoding=utf-8 从 xml 中删除非 UTF-8 字符 - Java

PHP从字符串中删除符号

从BeautifulSoup对象中删除非BMP字符

从字符串中删除重音符号

Android-从字符串中删除 URL 百分比符号

如何在 R 中使用 gsub 从字符串中删除非数字字符?