首页 > 后端开发 > Python教程 > 如何解决Python的'UnicodeDecodeError:'ascii'编解码器无法解码字节”错误?

如何解决Python的'UnicodeDecodeError:'ascii'编解码器无法解码字节”错误?

Mary-Kate Olsen
发布: 2024-12-10 17:00:12
原创
220 人浏览过

How to Solve Python's

如何修复“UnicodeDecodeError:'ascii'编解码器无法解码字节”

tl;dr / 快速修复

  • 避免不必要的解码/编码。
  • 不要假设 UTF-8 编码字符串。
  • 在代码中尽快将字符串转换为 Unicode 字符串。
  • 调整您的区域设置(请参阅:如何解决 Python 3.6 中的 UnicodeDecodeError?)。
  • 抵抗快速重新加载黑客的诱惑。

Python 中的 Unicode Zen 2.x

UnicodeDecodeError: 'ascii' 编解码器无法解码字节 当您尝试将包含非 ASCII 字符的 Python 2.x str 转换为 Unicode 字符串而不指定原始字符串的编码时,通常会发生。

Unicode 字符串(也称为 unicode)是 Python 中的一种单独的字符串类型,它保存 Unicode 点代码,并且可以表示整个范围内的任何 Unicode 点。相比之下,字符串包含各种格式的编码文本(例如 UTF-8、UTF-16、ISO-8895-1)。

Markdown 模块开发人员可能使用 unicode() 作为质量门来确保传入字符串是 Unicode。由于它们无法确定传入字符串的编码,因此您必须在将其传递到 Markdown 之前对其进行解码。

可以在代码中使用“u”前缀声明 Unicode 字符串:

my_u = u'my ünicôdé strįng'
print(type(my_u)) # <type 'unicode'>
登录后复制
登录后复制

Unicode 字符串也可以来自文件、数据库或网络模块,您无需指定

陷阱

即使没有显式 unicode() 调用,Unicode 转换也会发生:

# Explicit conversion without encoding
unicode('€')

# New-style format string into Unicode string
# Python attempts to convert value string to Unicode first
u"The currency is: {}".format('€')

# Old-style format string into Unicode string
# Python attempts to convert value string to Unicode first
u'The currency is: %s' % '€'

# Append string to Unicode
# Python attempts to convert string to Unicode first
u'The currency is: ' + '€'
登录后复制

示例

在下图中,“café根据终端类型,“UTF-8”和“Cp1252”的编码方式不同。在这两种情况下,“caf”均以纯 ASCII 编码。 UTF-8 使用两个字节来表示“é”,而 Cp1252 使用一个字节,该字节也恰好与 Unicode 点值匹配。在这种情况下,使用正确的编码调用decode(),并成功转换为Unicode:

[使用正确的编码成功进行Unicode转换的图表]

但是,如果decode () 用“ascii”调用,这类似于调用 unicode() 而不指定编码,会出现 UnicodeDecodeError发生:

[编码错误的 Unicode 转换不成功的图表]

Unicode 三明治

最佳实践是在代码中创建“Unicode 三明治”,您可以在其中:

  1. 将所有传入数据解码为 Unicode字符串。
  2. 对 Unicode 字符串执行操作。
  3. 在输出时编码为 str。

这种方法使您不必担心整个过程中的字符串编码问题。 code.

输入/解码

  • 对于源代码,请使用 Unicode 字符串文字(例如,u'Zürich')并添加编码标头(例如,#encoding: utf-8)。
  • 对于文件,请使用 io 模块的 TextWrapper 和适当的编码:

    my_u = u'my ünicôdé strįng'
    print(type(my_u)) # <type 'unicode'>
    登录后复制
    登录后复制
  • 对于数据库,配置连接以返回 Unicode 数据并使用 Unicode 字符串进行 SQL 查询。
  • 对于 HTTP,考虑使用 Python Requests 库,它在 response.text 中返回 Unicode .
  • 对于手动解码,请使用 my_string.decode(encoding),其中编码是适当的value.

输出

  • stdout/printing:Python 尝试为stdout 配置一个编码器,将 Unicode 字符串编码为控制台的编码。如果控制台的编码不正确,您可能会遇到错误。
  • 文件:io.open 可以透明地将 Unicode 编码为字节字符串。
  • 数据库:正确的配置允许您将 Unicode 数据直接写入到数据库。

以上是如何解决Python的'UnicodeDecodeError:'ascii'编解码器无法解码字节”错误?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板