gpt4 book ai didi

python - 如何修复 : "UnicodeDecodeError: ' ascii' codec can't decode byte"

转载 作者:行者123 更新时间:2023-12-01 16:30:28 24 4
gpt4 key购买 nike

as3:~/ngokevin-site# nano content/blog/20140114_test-chinese.mkd
as3:~/ngokevin-site# wok
Traceback (most recent call last):
File "/usr/local/bin/wok", line 4, in
Engine()
File "/usr/local/lib/python2.7/site-packages/wok/engine.py", line 104, in init
self.load_pages()
File "/usr/local/lib/python2.7/site-packages/wok/engine.py", line 238, in load_pages
p = Page.from_file(os.path.join(root, f), self.options, self, renderer)
File "/usr/local/lib/python2.7/site-packages/wok/page.py", line 111, in from_file
page.meta['content'] = page.renderer.render(page.original)
File "/usr/local/lib/python2.7/site-packages/wok/renderers.py", line 46, in render
return markdown(plain, Markdown.plugins)
File "/usr/local/lib/python2.7/site-packages/markdown/init.py", line 419, in markdown
return md.convert(text)
File "/usr/local/lib/python2.7/site-packages/markdown/init.py", line 281, in convert
source = unicode(source)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe8 in position 1: ordinal not in range(128). -- Note: Markdown only accepts unicode input!

如何解决?

在其他一些基于python的静态博客应用程序中,可以成功发布中文帖子。
例如这个应用程序: http://github.com/vrypan/bucket3 .在我的网站 http://bc3.brite.biz/ , 中文帖子可以成功发布。

最佳答案

tl;博士/快速修复

  • 不要随意解码/编码
  • 不要假设您的字符串是 UTF-8 编码的
  • 尝试在您的代码中尽快将字符串转换为 Unicode 字符串
  • 修复您的语言环境:How to solve UnicodeDecodeError in Python 3.6?
  • 不要试图使用快速 reload黑客

  • Python 2.x 中的 Unicode Zen - 长版

    不看源头很难知道根本原因,所以我只能笼统地说。
    UnicodeDecodeError: 'ascii' codec can't decode byte通常在您尝试转换 Python 2.x 时发生 str包含非 ASCII 到 Unicode 字符串而不指定原始字符串的编码。

    简而言之,Unicode 字符串是一种完全独立的 Python 字符串类型,不包含任何编码。他们只持有 Unicode 点代码因此可以保存整个范围内的任何 Unicode 点。字符串包含编码文本,如 UTF-8、UTF-16、ISO-8895-1、GBK、Big5 等。 字符串被解码为 Unicode Unicode 编码为字符串 .文件和文本数据始终以编码字符串传输。

    Markdown 模块作者可能使用 unicode() (抛出异常的地方)作为其余代码的质量门 - 它将转换 ASCII 或将现有的 Unicode 字符串重新包装为新的 Unicode 字符串。 Markdown 作者无法知道传入字符串的编码,因此在传递给 Markdown 之前将依赖您将字符串解码为 Unicode 字符串。

    Unicode 字符串可以使用 u 在你的代码中声明。字符串的前缀。例如。
    >>> my_u = u'my ünicôdé strįng'
    >>> type(my_u)
    <type 'unicode'>

    Unicode 字符串也可能来自文件、数据库和网络模块。发生这种情况时,您无需担心编码。

    陷阱

    转换自 str即使您没有明确调用 unicode(),也可能会发生 Unicode 转换.

    以下场景会导致 UnicodeDecodeError异常(exception):

    # Explicit conversion without encoding
    unicode('€')

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

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

    # Append string to Unicode
    # Python will try to convert string to Unicode first
    u'The currency is: ' + '€'

    例子

    在下图中,您可以看到单词 café已根据终端类型以“UTF-8”或“Cp1252”编码进行编码。在这两个示例中, caf只是普通的ascii。在 UTF-8 中, é使用两个字节进行编码。在“Cp1252”中,é 是 0xE9(这也恰好是 Unicode 点值(这不是巧合))。正确 decode()调用并成功转换为 Python Unicode:
    Diagram of a string being converted to a Python Unicode string

    在此图中, decode()ascii 调用(这与在没有给出编码的情况下调用 unicode() 相同)。由于 ASCII 不能包含大于 0x7F 的字节,这将抛出 UnicodeDecodeError异常(exception):

    Diagram of a string being converted to a Python Unicode string with the wrong encoding

    Unicode 三明治

    在您的代码中形成一个 Unicode 三明治是一种很好的做法,您可以将所有传入的数据解码为 Unicode 字符串,使用 Unicode,然后编码为 str正在出去的路上。这使您无需担心代码中间的字符串编码。

    输入/解码

    源代码

    如果您需要将非 ASCII 编码到您的源代码中,只需在字符串前加上 u 来创建 Unicode 字符串。 .例如。
    u'Zürich'

    为了让 Python 解码你的源代码,你需要添加一个编码头来匹配你文件的实际编码。例如,如果您的文件被编码为“UTF-8”,您将使用:
    # encoding: utf-8

    仅当您的 中有非 ASCII 时才需要这样做源代码 .

    文件

    通常从文件接收非 ASCII 数据。 io模块提供了一个 TextWrapper,可以使用给定的 encoding 动态解码您的文件。 .您必须为文件使用正确的编码 - 它不容易被猜到。例如,对于 UTF-8 文件:
    import io
    with io.open("my_utf8_file.txt", "r", encoding="utf-8") as my_file:
    my_unicode_string = my_file.read()
    my_unicode_string然后将适合传递给 Markdown。如果 UnicodeDecodeError来自 read()行,那么您可能使用了错误的编码值。

    CSV 文件

    Python 2.7 CSV 模块不支持非 ASCII 字符😩。但是,可以通过 https://pypi.python.org/pypi/backports.csv 获得帮助.

    像上面一样使用它,但将打开的文件传递给它:
    from backports import csv
    import io
    with io.open("my_utf8_file.txt", "r", encoding="utf-8") as my_file:
    for row in csv.reader(my_file):
    yield row

    数据库

    大多数 Python 数据库驱动程序可以以 Unicode 格式返回数据,但通常需要一些配置。 SQL 查询始终使用 Unicode 字符串。

    MySQL

    在连接字符串中添加:
    charset='utf8',
    use_unicode=True

    例如。
    >>> db = MySQLdb.connect(host="localhost", user='root', passwd='passwd', db='sandbox', use_unicode=True, charset="utf8")

    PostgreSQL

    添加:
    psycopg2.extensions.register_type(psycopg2.extensions.UNICODE)
    psycopg2.extensions.register_type(psycopg2.extensions.UNICODEARRAY)

    HTTP

    网页几乎可以用任何编码进行编码。 Content-type header 应包含 charset字段以提示编码。然后可以根据该值手动解码内容。或者, Python-Requests返回 response.text 中的 Unicodes .

    手动

    如果你必须手动解码字符串,你可以简单地做 my_string.decode(encoding) ,其中 encoding是适当的编码。此处给出了 Python 2.x 支持的编解码器: Standard Encodings .同样,如果您收到 UnicodeDecodeError那么你可能有错误的编码。

    三明治的肉

    像处理普通字符串一样使用 Unicode。

    输出

    标准输出/打印
    print通过标准输出流写入。 Python 尝试在 stdout 上配置编码器,以便将 Unicode 编码为控制台的编码。例如,如果 Linux shell 的 localeen_GB.UTF-8 ,输出将被编码为 UTF-8 .在 Windows 上,您将被限制为 8 位代码页。

    错误配置的控制台(例如损坏的区域设置)可能会导致意外的打印错误。 PYTHONIOENCODING环境变量可以强制对 stdout 进行编码。

    文件

    就像输入一样, io.open可用于透明地将 Unicode 转换为编码的字节字符串。

    数据库

    相同的读取配置将允许直接写入 Unicode。

    python 3

    Python 3 的 Unicode 能力并不比 Python 2.x 多,但它在这个主题上的困惑稍微少一些。例如常规 str现在是 Unicode 字符串和旧的 str现在是 bytes .

    默认编码是 UTF-8,所以如果你 .decode()一个没有给出编码的字节字符串,Python 3 使用 UTF-8 编码。这可能解决了人们 50% 的 Unicode 问题。

    此外, open()默认以文本模式运行,因此返回解码后的 str (Unicode 的)。编码源自您的语言环境,在 Un*x 系统上通常是 UTF-8,或者在 Windows 机器上是 8 位代码页,例如 windows-1251。

    为什么不应该使用 sys.setdefaultencoding('utf8')
    这是一个令人讨厌的 hack(您必须使用 reload 是有原因的),它只会掩盖问题并阻碍您迁移到 Python 3.x。了解问题,解决根本原因并享受 Unicode zen。
    Why should we NOT use sys.setdefaultencoding("utf-8") in a py script?欲知更多详情

    关于python - 如何修复 : "UnicodeDecodeError: ' ascii' codec can't decode byte",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21129020/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com