2016-07-25 49 views
-1

据我所知,这是python的概念,只有在字符串中有效的字符,但在我的情况下,操作系统将提供无效的编码字符串,我必须处理的路径名称。所以我最终得到的字符串包含非Unicode的字符。如何在Python中替换字符串中的无效Unicode字符?

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

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

你有一个提示,我如何能够创建这样一个替换字符串?

+0

请在你的问题的样本串;使用'print repr(obj)'来产生样本。您可能可以使用适当的'errors'模式让Python为您插入占位符。 –

+0

。解码(“utf-8”,“忽略”)忽略坏字符。 – les

+0

在bash shell中,我将问号标记为替换字符。在文件管理器中,我看到一个倒置的问号。 –

回答

0

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

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) 

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

0

您还没有给出任何示例。所以我考虑过一个例子来回答你的问题。

X = '这是一只猫,看起来良好ðŸ~Š' 打印X x.replace( 'ðŸ~Š', '')

输出是: 这是一只猫,看起来好ðŸ~Š “这是一只猫看起来不错”

+0

我没有具体的例子说明在我的情况下导致错误的实际字节模式。我正在编写的过滤器旨在识别给定字符串中的Unicode编码问题。你可能会重现这种情况的一种方法是简单地生成随机数据,然后尝试将此数据解释为UTF-8。你通常会失败,因为这个二进制数据很可能会违反UTF-8标准。对不起,我无法确定这些违规行为是如何发生的。我试图找出存在的第一步。 –

+0

如果你不知道非Unicode字符,你可以试试这个:试试: string.decode('utf-8') print“string is UTF-8,length%d bytes”%len(string) UnicodeError: print“字符串不是UTF-8” – Chandan

+0

是的,但有趣的部分开始于我不仅想识别字符串是否为Unicode,而是通过过滤或替换字符串来实际了解字符串本身的一些想法。字符'无效。 –

1

如果你有字节串(未解码的数据),使用'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 
+0

不错!我没有在文档中看到这一点:我希望这些功能可以被描述得更加突出。 –

+0

感谢您的帮助。我更新了解决方案。 –