如何修复:“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/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 等。字符串解码为 Unicode,Unicode 编码为字符串。文件和文本数据始终以编码字符串的形式传输。
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:
在此图中,decode()
使用 进行调用ascii
(与未指定编码的调用相同unicode()
)。由于 ASCII 不能包含大于 的字节0x7F
,因此这将引发UnicodeDecodeError
异常:
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 字符
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理必备:盘点2024年13款好用的项目管理软件