为什么 '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")

您的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有各种字母a的表示形式,你可能还想将Alpha和Aleph以及…翻译成a(最好是丢弃,尤其是如果你有外语,可能会丢弃所有内容(。

最新更新