据我所知,python的概念只是在字符串中只有有效字符,但在我的情况下,操作系统将在我必须处理的路径名中传递带有无效编码的字符串。所以我最终得到的字符串包含非unicode字符。
为了纠正这些问题,我需要以某种方式显示这些字符串。不幸的是我无法打印它们因为它们包含非unicode字符。是否有一种优雅的方式来以某种方式替换这些字符,至少可以了解字符串的内容?
我的想法是逐字符处理这些字符串,并检查存储的字符是否实际上是有效的unicode。如果字符无效,我想使用某个unicode符号。但是我怎么能这样做呢?使用codecs
似乎不适用于此目的:我已经有一个由操作系统返回的字符串,而不是字节数组。将字符串转换为字节数组似乎涉及解码,当然我的情况会失败。所以我似乎陷入困境。
您是否有关于如何创建此类替换字符串的提示?
答案 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')只会引发异常。