修正方法: "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/ では、中国語の記事が正常に公開されます。

**遂に手に入れました。

as3:/usr/local/lib/python2.7/site-packages# cat sitecustomize.py
# encoding=utf8  
import sys  

reload(sys)  
sys.setdefaultencoding('utf8')

チェックしてみましょう:

as3:~/ngokevin-site# python
Python 2.7.6 (default, Dec  6 2013, 14:49:02)
[GCC 4.4.5] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> reload(sys)

>>> sys.getdefaultencoding()
'utf8'
>>>

上記はpythonのデフォルトのエンコーディングがutf8であることを示しています。そうすると、エラーは出なくなります。

解説 (14)

これは典型的な "unicode issue"です。 これを説明するには、StackOverflowの回答では完全に説明できないと思います。

よく説明されていますここ

簡単にまとめると、バイトの文字列として解釈されるものを、Unicode文字にデコードする必要があるものに渡しているが、デフォルトのコーデック(ascii)が失敗しているということです。

私が紹介したプレゼンテーションには、これを避けるためのアドバイスがあります。 あなたのコードを"unicode sandwich"にしてください。 Python 2では、from __future__ import unicode_literalsの使用が役立ちます。

更新:コードの修正方法について

OK - あなたの変数 "source"には、いくつかのバイトがあります。 あなたの質問からは、どのようにしてこのバイトが入ったのかがわかりません。 いずれにしても、それらはasciiでエンコードされていませんが、pythonはそれらがasciiであると仮定して、unicodeに変換しようとしています。 エンコーディングが何であるかを明示的に伝える必要があります。 これはつまり、エンコーディングが何であるかを_知る必要があるということです! それは必ずしも簡単ではありませんし、この文字列がどこから来たのかに完全に依存します。 たとえば UTF-8 のような一般的なエンコーディングを試してみることができます。 unicode()には、2番目のパラメータとしてエンコーディングを指定します。

source = unicode(source, 'utf-8')
解説 (11)

デフォルトのエンコーディングを確認する(print sys.getdefaultencoding())と、ASCIIを使用していると返されるケースがあります。UTF-8に変更すると、変数の内容によってはうまくいかない'ことがあります。 別の方法を見つけました。

import sys
reload(sys)  
sys.setdefaultencoding('Cp1252')
解説 (4)