如何在Python中替换字符串中的无效unicode字符?

时间:2016-07-25 09:45:43

标签: python string unicode character-encoding

据我所知,python的概念只是在字符串中只有有效字符,但在我的情况下,操作系统将在我必须处理的路径名中传递带有无效编码的字符串。所以我最终得到的字符串包含非unicode字符。

为了纠正这些问题,我需要以某种方式显示这些字符串。不幸的是我无法打印它们因为它们包含非unicode字符。是否有一种优雅的方式来以某种方式替换这些字符,至少可以了解字符串的内容?

我的想法是逐字符处理这些字符串,并检查存储的字符是否实际上是有效的unicode。如果字符无效,我想使用某个unicode符号。但是我怎么能这样做呢?使用codecs似乎不适用于此目的:我已经有一个由操作系统返回的字符串,而不是字节数组。将字符串转换为字节数组似乎涉及解码,当然我的情况会失败。所以我似乎陷入困境。

您是否有关于如何创建此类替换字符串的提示?

4 个答案:

答案 0 :(得分:4)

如果您有 bytestring (未解码的数据),请使用'replace'错误处理程序。例如,如果您的数据(大部分)是UTF-8编码的,那么您可以使用:

decoded_unicode = bytestring.decode('utf-8', 'replace')
对于任何无法解码的字节,都会插入

U+FFFD � REPLACEMENT CHARACTER个字符。

如果您想使用其他替换字符,以后可以轻松替换这些字符:

decoded_unicode = decoded_unicode.replace(u'\ufffd', '#')

演示:

>>> bytestring = 'F\xc3\xb8\xc3\xb6\xbbB\xc3\xa5r'
>>> bytestring.decode('utf8')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/mjpieters/Development/venvs/stackoverflow-2.7/lib/python2.7/encodings/utf_8.py", line 16, in decode
    return codecs.utf_8_decode(input, errors, True)
UnicodeDecodeError: 'utf8' codec can't decode byte 0xbb in position 5: invalid start byte
>>> bytestring.decode('utf8', 'replace')
u'F\xf8\xf6\ufffdB\xe5r'
>>> print bytestring.decode('utf8', 'replace')
Føö�Bår

答案 1 :(得分:1)

感谢您的评论。这样我就能够实现更好的解决方案:

    try:
        s2 = codecs.encode(s, "utf-8")
        return (True, s, None)
    except Exception as e:
        ret = codecs.decode(codecs.encode(s, "utf-8", "replace"), "utf-8")
        return (False, ret, e)

请分享对该解决方案的任何改进。谢谢!

答案 2 :(得分:1)

你没有给出任何例子。因此,我考虑过一个例子来回答你的问题。

x ='这是一只看起来不错的猫ðŸ〜Š' 打印x x.replace( 'ðŸ~Š', '')

输出是: 这是一只看起来不错的猫ðŸ〜Š “这是一只看起来不错的猫”

答案 3 :(得分:1)

正确的方法(至少在python2中)是使用unicodedata.normalize:

unicodedata.normalize('NFKD', text).encode('utf-8', 'ignore')

decode('utf-8','ignore')只会引发异常。