2016-07-25 138 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

感謝您的幫助。我更新瞭解決方案。 –