首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用python标识垃圾unicode字符串

使用python标识垃圾unicode字符串
EN

Stack Overflow用户
提问于 2015-03-16 07:58:03
回答 2查看 2.8K关注 0票数 3

我的脚本是从csv文件中读取数据,csv文件可以有多个字符串的英文或非英语单词。

当文本文件有垃圾字符串时,我想识别这些字符串,跳过这些字符串并处理其他字符串。

代码语言:javascript
复制
doc = codecs.open(input_text_file, "rb",'utf_8_sig')
fob = csv.DictReader(doc)
for row, entry in enumerate(f):
    if is_valid_unicode_str(row['Name']):
         process_futher

def is_valid_unicode_str(value):
     try:
         function
         return True
     except UnicodeEncodeError:
         return false

csv投入:

代码语言:javascript
复制
"Name"
"袋è¢âdcx€¹Ã¤Â¸Å½Ã¦Å“‹å‹们çâ€ÂµÃ¥Â­Âå•â€"
"元大寶來證券"
"John Dove"

我想要破坏函数is_valid_unicode_str(),它将标识垃圾字符串并只处理有效的字符串。

我试着使用decode is,但是在解码垃圾字符串时它没有失败。

代码语言:javascript
复制
value.decode('utf8')

预期输出为字符串,将处理中文和英文字符串。

请您指导我如何实现过滤有效Unicode文件的功能?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-16 09:51:46

您有Mojibake弦;文本编码为一个(正确)编解码器,然后解码为另一个。

在本例中,您的文本被Windows 1252代码页解码;文本中的U+20AC欧元符号是典型的CP1252 Mojibake。最初的编码可以是中国编码家族之一,也可以是UTF-8 - CP1252 Mojibake的多次往返.哪一个我无法确定,我不能读中文,也没有你的完整数据;CP1252 Mojibake包含一些不可打印的字符,比如0x81和0x8D字节,当你在这里发布问题时可能会丢失这些字符。

我会安装项目;它不会修复GB*编码(I 请求项目增加支持),但它包含一个名为sloppy-windows-1252的新编解码器,它将允许您用该编解码器逆转错误解码:

代码语言:javascript
复制
>>> import ftfy  # registers extra codecs on import
>>> text = u'袋è¢âdcx€¹Ã¤Â¸Å½Ã¦Å“‹å‹们çâ€ÂµÃ¥Â­Âå•â€'
>>> print text.encode('sloppy-windows-1252').decode('gb2312', 'replace')
猫垄�姑�⑩dcx�盲赂沤忙��姑ヂ�姑ぢ宦�р�得ヂ�氓�⑩�
>>> print text.encode('sloppy-windows-1252').decode('gbk', 'replace')
猫垄鈥姑�⑩dcx�盲赂沤忙艙鈥姑ヂ鈥姑ぢ宦�р�得ヂ�氓鈥⑩�
>>> print text.encode('sloppy-windows-1252').decode('gb18030', 'replace')
猫垄鈥姑⑩dcx�盲赂沤忙艙鈥姑ヂ鈥姑ぢ宦р�得ヂ氓鈥⑩�
>>> print text.encode('sloppy-windows-1252').decode('utf8', 'ignore').encode('sloppy-windows-1252').decode('utf8', 'replace')
袋�dcx与朋�们���

U+FFFD替换字符显示解码并不完全成功,但这可能是因为您在这里复制的字符串丢失了任何不可打印的内容,或者使用了0x81或0x8D字节。

您可以尝试以这种方式修复您的数据;从文件数据中,在编码到sloppy-windows-1252之后,尝试解码到一个GB*编解码器,或者从UTF-8往返两次,看看哪些最适合。

如果这还不够好(不能修复数据),可以使用函数来检测问题:

代码语言:javascript
复制
>>> from ftfy.badness import sequence_weirdness
>>> sequence_weirdness(text)
9
>>> sequence_weirdness(u'元大寶來證券')
0
>>> sequence_weirdness(u'John Dove')
0

莫吉贝克在序列怪异度上得分较高。您可以尝试为您的数据找到一个合适的阈值,在此之前,您将调用最有可能被损坏的数据。

然而,我认为我们可以使用一个非零的返回值作为另一个测试的起点。英语文本在这个尺度上应该是0,中文文本也应该是0。与英语混在一起的中文仍然可以得分超过0,但您不能将该中文文本编码到CP-1252编解码器中,而您可以使用破译的文本:

代码语言:javascript
复制
from ftfy.badness import sequence_weirdness

def is_valid_unicode_str(text):
    if not sequence_weirdness(text):
        # nothing weird, should be okay
        return True
    try:
        text.encode('sloppy-windows-1252')
    except UnicodeEncodeError:
        # Not CP-1252 encodable, probably fine
        return True
    else:
        # Encodable as CP-1252, Mojibake alert level high
        return False
票数 3
EN

Stack Overflow用户

发布于 2015-03-16 20:53:35

(ftfy developer这里)

我发现这篇文章很可能是“袋袋与朋友们电子商”。我不得不猜测字符友,子和商,因为一些不可打印的字符是您问题中字符串中缺少的字符。在猜测的时候,我从少数可能性中选出了最常见的角色。我不知道"dcx“到哪里去了,也不知道它为什么会在那里。

谷歌翻译在这里不是很有帮助,但它似乎意味着一些关于电子商务。

下面是你短信中发生的所有事情:

  1. 它被编码为UTF-8,并被错误地解码为软盘-windows-1252,两次。
  2. 它将字母"dcx“插入到UTF-8序列的中间。
  3. 删除了windows(1252)中不存在的字节值为81、8d、8f、90和9d的字符。
  4. 从末尾移除一个不间断的空间(字节值a0)。

如果只发生了第一个问题,ftfy.fix_text_encoding就能够解决它。当您试图将字符串放到堆栈溢出时,可能会发生剩余的问题。

下面是我的建议:

  • 找出谁一直错误地将数据解码为软盘-windows-1252,并让他们将其解码为UTF-8。
  • 如果您以这样的字符串结束,请在上面尝试ftfy.fix_text_encoding
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29071995

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档