首页 > 解决方案 > 为什么 'encode("utf-8", 'ignore').decode("utf-8")' 在 Python 3 中不去除非 UTF8 字符?

问题描述

我正在使用 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")

标签: pythondjangopython-3.xstringutf-8

解决方案


row['website']已经是一个 Unicode 字符串。UTF-8 可以支持所有有效的 Unicode 代码点,因此.encode('utf8','ignore')通常不会忽略任何内容并将整个字符串编码为 UTF-8,然后.decode('utf8')再次将其更改回 Unicode 字符串。

如果您只是想去除非 ASCII 字符,请使用以下内容仅过滤 ASCII 字符并忽略其余字符。

row['website'].encode('ascii','ignore').decode('ascii')

推荐阅读