修正方法: "UnicodeDecodeError: 'ascii' codec can't decode byte"
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/ では、中国語の記事が正常に公開されます。
425
3
**遂に手に入れました。
チェックしてみましょう:。
上記はpythonのデフォルトのエンコーディングが
utf8
であることを示しています。そうすると、エラーは出なくなります。これは典型的な "unicode issue"です。 これを説明するには、StackOverflowの回答では完全に説明できないと思います。
よく説明されていますここ。
簡単にまとめると、バイトの文字列として解釈されるものを、Unicode文字にデコードする必要があるものに渡しているが、デフォルトのコーデック(ascii)が失敗しているということです。
私が紹介したプレゼンテーションには、これを避けるためのアドバイスがあります。 あなたのコードを"unicode sandwich"にしてください。 Python 2では、
from __future__ import unicode_literals
の使用が役立ちます。更新:コードの修正方法について
OK - あなたの変数 "source"には、いくつかのバイトがあります。 あなたの質問からは、どのようにしてこのバイトが入ったのかがわかりません。 いずれにしても、それらはasciiでエンコードされていませんが、pythonはそれらがasciiであると仮定して、unicodeに変換しようとしています。 エンコーディングが何であるかを明示的に伝える必要があります。 これはつまり、エンコーディングが何であるかを_知る必要があるということです! それは必ずしも簡単ではありませんし、この文字列がどこから来たのかに完全に依存します。 たとえば UTF-8 のような一般的なエンコーディングを試してみることができます。 unicode()には、2番目のパラメータとしてエンコーディングを指定します。
デフォルトのエンコーディングを確認する(
print sys.getdefaultencoding()
)と、ASCIIを使用していると返されるケースがあります。UTF-8に変更すると、変数の内容によってはうまくいかない'ことがあります。 別の方法を見つけました。