[英]Why doesn't 'encode("utf-8", 'ignore').decode("utf-8")' strip non-UTF8 chars in Python 3?
我正在使用 Python 3.7 和 Django 2.0。 我想從字符串中去除非 UTF-8 字符,這是我通過讀取這個 CSV 文件獲得的。 我試過這個...
web_site = row['website'].strip().encode("utf-8", 'ignore').decode("utf-8")
但這似乎並沒有完成這項工作,因為我的結果字符串看起來像......
web_site: "wbez.org<200e>"
無論這個“<200e>”是什么,顯然是非 UTF-8 字符串,因為當我嘗試將其插入 MySQL 數據庫(部署為 docker 映像)時,我收到以下錯誤...
web_1 | django.db.utils.OperationalError: Problem installing fixture '/app/maps/fixtures/seed_data.yaml': Could not load maps.Coop(pk=191): (1366, "Incorrect string value: '\\xE2\\x80\\x8E' for column 'web_site' at row 1")
您的row['website']
已經是一個 Unicode 字符串。 UTF-8 可以支持所有有效的 Unicode 代碼點,因此.encode('utf8','ignore')
通常不會忽略任何內容並將整個字符串編碼為 UTF-8,而.decode('utf8')
將其改回再次轉換為 Unicode 字符串。
如果您只是想去除非 ASCII 字符,請使用以下內容僅過濾 ASCII 字符並忽略其余字符。
row['website'].encode('ascii','ignore').decode('ascii')
我認為您混淆了編碼。
Python 有一個標准字符集:Unicode
UTF-8 只是 Unicode 的編碼。 Unicode 中的所有字符都可以用 UTF-8 編碼,所有有效的 UTF-8 代碼都可以解釋為 unicode 字符。
所以你只是編碼和解碼 Unicode 字符串,所以代碼應該什么都不做。 (確實有一些例外情況:Python 字符串確實是 Unicode 的超集,因此您的代碼只會刪除非 Unicode 字符,請參閱surrogateescape
,對於這種極少數情況,通常您只能通過讀取sys.argv
或os.environ
)。
無論如何,我認為你做錯了。 在此站點中搜索一般問題(例如“刪除非 ascii 字符”)。 通常最好先分解(用K,兼容),然后去掉重音,再去掉非ascii字符,這樣你會得到更多的字符翻譯。 有各種函數可以創建slug ,它們做得更好,或者還有一個庫可以將更多字符翻譯成“幾乎等效”的 ascii 字符(Unicode 有各種表示 LETTER A,您可能還想翻譯 Alpha 和 Aleph和 ... 變成 A (然后丟棄更好,特別是如果你有外語,你可能會丟棄所有東西)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.