使用python识别垃圾unicode字符串

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

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

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输入:

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

我想玷污函数is_valid_unicode_str(),它将识别垃圾字符串并仅处理有效字符串.

我尝试使用解码但是在解码垃圾字符串时它并没有失败

value.decode('utf8')

The expected output are string with Chinese and English string to be process

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

最佳答案 你有
Mojibake strings;文本编码为一个(正确的)编解码器,然后解码为另一个.

在这种情况下,您的文本使用Windows 1252 codepage解码;文中的U+20AC EURO SIGN是典型的CP1252 Mojibakes.原始编码可以是GB* family of Chinese encodings之一,也可以是多次往返UTF-8-CP1252 Mojibake.哪一个我无法确定,我看不懂中文,也没有你的全部数据; CP1252 Mojibakes包含不可打印的字符,如0x81和0x8D字节,当您在此处发布问题时可能已丢失.

我安装了ftfy project;它不会修复GB *编码(I requested the project add support),但它包含一个名为sloppy-windows-1252的新编解码器,它可以让你用该编解码器反转错误的解码:

>>> 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 REPLACEMENT CHARACTER显示解码并不完全成功,但这可能是由于您复制的字符串丢失了任何不可打印或使用0x81或0x8D字节的事实.

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

如果这还不够好(您无法修复数据),可以使用ftfy.badness.sequence_weirdness() function尝试检测问题:

>>> from ftfy.badness import sequence_weirdness
>>> sequence_weirdness(text)
9
>>> sequence_weirdness(u'元大寶來證券')
0
>>> sequence_weirdness(u'John Dove')
0

Mojibakes在序列怪异程度上得分很高.您可以尝试为数据找到合适的阈值,以便在您调用最可能已损坏的数据时.

但是,我认为我们可以使用非零返回值作为另一个测试的起点.英文文本应该按该等级评分为0,中文文本也应如此.中文与英语混合仍然可以得分超过0,但你不能将中文文本编码到CP-1252编解码器,而你可以使用破碎的文本:

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
点赞