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

2024-12-06 08:40:00
admin
原创
96
摘要:问题描述: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 字符

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   984  
  在项目管理领域,CDCP(Certified Data Center Professional)认证评审是一个至关重要的环节,它不仅验证了项目团队的专业能力,还直接关系到项目的成功与否。在这一评审过程中,沟通技巧的运用至关重要。有效的沟通不仅能够确保信息的准确传递,还能增强团队协作,提升评审效率。本文将深入探讨CDCP...
华为IPD流程   0  
  IPD(Integrated Product Development,集成产品开发)是一种以客户需求为核心、跨部门协同的产品开发模式,旨在通过高效的资源整合和流程优化,提升产品开发的成功率和市场竞争力。在IPD培训课程中,掌握关键成功因素是确保团队能够有效实施这一模式的核心。以下将从五个关键成功因素展开讨论,帮助企业和...
IPD项目流程图   0  
  华为IPD(Integrated Product Development,集成产品开发)流程是华为公司在其全球化进程中逐步构建和完善的一套高效产品开发管理体系。这一流程不仅帮助华为在技术创新和产品交付上实现了质的飞跃,还为其在全球市场中赢得了显著的竞争优势。IPD的核心在于通过跨部门协作、阶段性评审和市场需求驱动,确保...
华为IPD   0  
  华为作为全球领先的通信技术解决方案提供商,其成功的背后离不开一套成熟的管理体系——集成产品开发(IPD)。IPD不仅是一种产品开发流程,更是一种系统化的管理思想,它通过跨职能团队的协作、阶段评审机制和市场需求驱动的开发模式,帮助华为在全球市场中脱颖而出。从最初的国内市场到如今的全球化布局,华为的IPD体系在多个领域展现...
IPD管理流程   0  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用