簡體   English   中英

為什么 'encode("utf-8", 'ignore').decode("utf-8")' 在 Python 3 中不去除非 UTF8 字符?

[英]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.argvos.environ )。

無論如何,我認為你做錯了。 在此站點中搜索一般問題(例如“刪除非 ascii 字符”)。 通常最好先分解(用K,兼容),然后去掉重音,再去掉非ascii字符,這樣你會得到更多的字符翻譯。 有各種函數可以創建slug ,它們做得更好,或者還有一個庫可以將更多字符翻譯成“幾乎等效”的 ascii 字符(Unicode 有各種表示 LETTER A,您可能還想翻譯 Alpha 和 Aleph和 ... 變成 A (然后丟棄更好,特別是如果你有外語,你可能會丟棄所有東西)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM