2009-12-16 95 views
5

我有我的程序的一個功能,用戶可以上傳一個csv文件,我的程序經過並用作輸入。我有一位用戶抱怨他的輸入引發了錯誤。錯誤是由於存在編碼錯誤的非法字符引起的。字符如下:如何徹底清理python中的非法字符字符串?

有時它看起來像一個帶「?」的鑽石,在中間。有時它看起來像是一個雙「鑽石」,「?」在中間,有時顯示爲「\ xa0」,有時顯示爲「\ xa0 \ xa0」。

在我的計劃,如果我做的:

print str_with_weird_char 

的striong將我與鑽石終端顯示「?」取代怪異的角色。如果我複製+粘貼串入IPython中,它會與此消息退出:

In [1]: g="blah��blah" 
WARNING: 
******** 
You or a %run:ed script called sys.stdin.close() or sys.stdout.close()! 
Exiting IPython! 

通知如何鑽石「?」現在是兩倍。出於某種原因,複製粘貼+使得它一倍...

在Django的追蹤頁面,它看起來像這樣:

UnicodeDecodeError at /chris/import.html 
('ascii', 'blah \xa0 BLAH', 14, 15, 'ordinal not in range(128)') 

是弄亂我的事情是,我不能這樣做任何事沒有它的字符串會引起異常。我試過unicode(),我試過str(),我試過.encode(),我試過.encode(「utf-8」),無論它拋出什麼錯誤。

我能做些什麼得到這個東西是一個工作的字符串?

+0

順便說一句,你「無法做任何事」的原因可能是因爲你嘗試的所有事情都涉及在提示符下鍵入表達式。交互式解釋器通過調用repr()來顯示每個表達式的結果。有時候會導致解碼錯誤,因爲您的控制檯不處理Unicode(或其他原因?)。如果你得到這樣的東西,嘗試將它分配給一個虛擬名稱(例如「x = foo」而不是「foo」),並且通常不會顯示異常。那麼你知道這個例外是虛假的。 –

回答

6

可以傳遞,「忽略」跳過.encode/.decode 無效字符,如"ILLEGAL".decode("utf8","ignore")

>>> "ILLEGA\xa0L".decode("utf8") 
... 
UnicodeDecodeError: 'utf8' codec can't decode byte 0xa0 in position 6: unexpected code byte 

>>> "ILLEGA\xa0L".decode("utf8","ignore") 
u'ILLEGAL' 
>>> 
2

聲明在腳本的第二行編碼。它真的必須是第二。像

#!/usr/bin/python 
# coding=utf-8 

這可能足以解決您的問題本身。如果沒有,請參閱str.encode('utf-8')和str.decode('utf-8')。