Python UnicodeDecodeError - 我误解编码了吗?

新手上路,请多包涵

关于为什么这不起作用的任何想法?我真的认为“忽略”会做正确的事。

 >>> 'add \x93Monitoring\x93 to list '.encode('latin-1','ignore')
Traceback (most recent call last):
  File "<interactive input>", line 1, in ?
UnicodeDecodeError: 'ascii' codec can't decode byte 0x93 in position 4: ordinal not in range(128)

原文由 Greg 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 410
2 个回答

……它们被称为“编码”是有原因的……

一点序言:将 unicode 视为规范或理想状态。 Unicode 只是一个字符表。 №65 是拉丁语大写字母 A。 №937 是希腊语大写字母 omega。只是。

为了让计算机存储和/或操作 Unicode,它必须将其 编码 为字节。 Unicode最直接的 编码 是UCS-4;每个字符占4个字节,所有~1000000个字符可用。这 4 个字节包含 Unicode 表中字符的编号,作为一个 4 字节整数。另一种非常有用的编码是 UTF-8,它可以用一到四个字节对任何 Unicode 字符进行编码。但也有一些有限的编码,如“latin1”,它包含的字符范围非常有限,主要由西方国家使用。这样的 编码 每个字符只使用一个字节。

基本上Unicode可以用很多encoding进行 _编码_,编码后的字符串可以 解码 成Unicode。问题是,Unicode 来得太晚了,所以我们所有使用 8 位 字符集 长大的人都太晚才知道我们一直在使用 编码 字符串。编码可以是 ISO8859-1,或 windows CP437,或 CP850,或,或,或,取决于我们的系统默认值。

因此,当您在源代码中输入字符串“add “Monitoring“ to list”(我认为您想要字符串“add “Monitoring” to list”,注意第二个引号)时,您实际上已经在使用字符串根据您系统的默认代码页 _编码_(字节 \x93 我假设您使用 Windows 代码页 1252,“西方”)。如果你想从中获取 Unicode,你需要从“cp1252”编码中 解码 字符串。

所以,你打算做的是:

 "add \x93Monitoring\x94 to list".decode("cp1252", "ignore")

不幸的是,Python 2.x 也包含一个 .encode 字符串方法;这是“特殊”编码的便利函数,例如“zip”或“rot13”或“base64”编码,它们与 Unicode 无关。

无论如何,对于来回的 Unicode 转换,您只需要记住:

  • Unicode 字符串被 编码 为 Python 2.x 字符串(实际上是一个字节序列)
  • Python 2.x 字符串被 解码 为 Unicode 字符串

在这两种情况下,您都需要指定将使用的 _编码_。

我不是很清楚,我很困,但我当然希望我有所帮助。

PS 一个幽默的旁注:玛雅人没有 Unicode;古罗马人、古希腊人、古埃及人也没有。他们都有自己的“编码”,对其他文化几乎不尊重。所有这些文明都化为灰烬。人家想想吧!为了人类的利益,让您的应用程序支持 Unicode。 :)

PS2 请不要说“但是中国人……”来破坏之前的消息。但是,如果您倾向于或有义务这样做,请认为 Unicode BMP 主要由中文表意文字填充,因此推迟它,因为中文是 Unicode 的基础。只要人们开发支持 Unicode 的应用程序,我就可以继续编造离谱的谎言。

原文由 tzot 发布,翻译遵循 CC BY-SA 4.0 许可协议

encode 可用于 unicode 字符串,但您那里的字符串似乎不是 unicode(尝试使用 u’add \x93Monitoring\x93 to list ‘)

 >>> u'add \x93Monitoring\x93 to list '.encode('latin-1','ignore')
'add \x93Monitoring\x93 to list '

原文由 rob 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题