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

2024-12-06 08:40:00
admin
原创
164
摘要:问题描述:as3:~/ngokevin-site# nano content/blog/20140114_test-chinese.mkd as3:~/ngokevin-site# wok Traceback (most recent call last): File "/usr/local/b...

问题描述:

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/中,中文帖子可以成功发布。


解决方案 1:

tl;dr / 快速修复

  • 不要随意解码/编码

  • 不要假设你的字符串是 UTF-8 编码的

  • 尝试在代码中尽快将字符串转换为 Unicode 字符串

  • 修复您的语言环境:如何解决 Python 3.6 中的 UnicodeDecodeError?

  • 不要试图使用快速reload破解方法

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

如果不看源头就很难知道根本原因,所以我只能泛泛地说一下。

UnicodeDecodeError: 'ascii' codec can't decode byte通常当您尝试将包含非 ASCII 的 Python 2.x 转换str为 Unicode 字符串而不指定原始字符串的编码时发生。

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

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

u可以使用字符串前缀在代码中声明 Unicode 字符串。例如

>>> my_u = u'my ünicôdé strįng'
>>> type(my_u)
<type 'unicode'>

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

陷阱

str即使您没有明确调用,也会发生从 到 Unicode 的转换unicode()

以下情况会导致UnicodeDecodeError异常:

# 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:
字符串转换为 Python Unicode 字符串的示意图

在此图中,decode()使用 进行调用ascii(与未指定编码的调用相同unicode())。由于 ASCII 不能包含大于 的字节0x7F,因此这将引发UnicodeDecodeError异常:

字符串被转换为具有错误编码的 Python Unicode 字符串的图表

Unicode 三明治

在代码中形成 Unicode 三明治是一种很好的做法,即将所有传入数据解码为 Unicode 字符串,处理 Unicode,然后str在输出时编码为 s。这样就无需担心代码中间的字符串编码。

输入/解码

源代码

如果你需要将非 ASCII 嵌入到源代码中,只需在字符串前加上 来创建 Unicode 字符串即可u。例如

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 字符

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用