【问题标题】:In Python 3, how do you remove all non-UTF8 characters from a string?在 Python 3 中,如何从字符串中删除所有非 UTF8 字符?
【发布时间】:2020-01-28 16:17:17
【问题描述】:

我正在使用 Python 3.7。如何从字符串中删除所有非 UTF-8 字符?我尝试在下面使用“lambda x: x.decode('utf-8','ignore').encode("utf-8")”

coop_types = map(
    lambda x: x.decode('utf-8','ignore').encode("utf-8"),
    filter(None, set(d['type'] for d in input_file))
)

但这会导致错误...

Traceback (most recent call last):
  File "scripts/parse_coop_csv.py", line 30, in <module>
    for coop_type in coop_types:
  File "scripts/parse_coop_csv.py", line 25, in <lambda>
    lambda x: x.decode('utf-8','ignore').encode("utf-8"),
AttributeError: 'str' object has no attribute 'decode'

如果您有一种通用的方法可以从字符串中删除所有非 UTF8 字符,那就是我正在寻找的全部内容。

【问题讨论】:

  • 你先编码 x然后解码。 str.encode 接受一个 Unicode 字符串并生成它的 UTF-8 编码。 bytes.decode 接受一个字符串并尝试将其解释为一种编码以生成 str 对象。
  • 您能否举例说明str 实例中的非UTF-8 字符是什么?您是指代理代码点吗?

标签: python python-3.x utf-8 decode encode


【解决方案1】:

你从一个字符串开始。你不能decode 一个str (它已经解码文本,你只能再次将其编码为二进制数据)。 UTF-8 编码几乎所有有效的 Unicode 文本(这是 str 存储的),所以这不应该出现太多,但如果你在输入中遇到 surrogate characters,你可以反转方向,改变:

x.decode('utf-8','ignore').encode("utf-8")

到:

x.encode('utf-8','ignore').decode("utf-8")

您对任何可 UTF-8 编码的内容进行编码,丢弃不可编码的内容,然后解码现在干净的 UTF-8 字节。

【讨论】:

  • 旁注:如果问题是代理,您可能不想丢弃它们;你可能只需要首先accept them properly (e.g. via json.loads or the like),所以你永远不会真正看到它们,你只会看到它们代表的单个 Unicode 字符。
  • 只要您熟悉输入数据和丢失字节 127 以外的字符的结果,那么这是一个不错的选择 - 可能是我在本主题中找到的最简单的选择之一。干得好,@ShadowRanger
  • @NathanBenton:需要明确的是,这不会丢失字节 127 以外的所有字符(如果您使用 'ascii' 作为编码而不是 'utf-8' 它会丢失)。 UTF-8 处理所有普通的 Unicode 序数,只是不处理 high-low surrogates(一个 UTF-16 的东西,不适用于 UTF-8)。
  • 知道了 - 感谢您的反馈和更正,@ShadowRanger
猜你喜欢
  • 2014-04-26
  • 2010-11-17
  • 2011-10-19
  • 1970-01-01
  • 2019-08-02
  • 2010-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多