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!
Nasıl düzeltilir?
Diğer bazı python tabanlı statik blog uygulamalarında, Çince gönderi başarıyla yayınlanabilir. Bu uygulama gibi: http://github.com/vrypan/bucket3. Sitemde http://bc3.brite.biz/, Çince yazı başarıyla yayınlanabilir.
Sonunda anladım:
as3:/usr/local/lib/python2.7/site-packages# cat sitecustomize.py
# encoding=utf8
import sys
reload(sys)
sys.setdefaultencoding('utf8')
Bakayım:
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)
<module 'sys' (built-in)>
>>> sys.getdefaultencoding()
'utf8'
>>>
Yukarıda python'un varsayılan kodlamasının utf8
olduğu gösterilmektedir. O zaman hata artık yok.
Bu klasik "unicode sorunu". Bunu açıklamanın, neler olduğunu tamamen açıklamak için bir StackOverflow yanıtının kapsamının ötesinde olduğuna inanıyorum.
İyi bir şekilde açıklanmıştır burada.
Çok kısa bir özetle, bayt dizesi olarak yorumlanan bir şeyi Unicode karakterlerine çözmesi gereken bir şeye aktardınız, ancak varsayılan kodek (ascii) başarısız oluyor.
Sizi yönlendirdiğim sunumda bundan kaçınmak için tavsiyeler yer alıyor. Kodunuzu bir "unicode sandviç" haline getirin. Python 2'de `from future import unicode_literals' kullanımı yardımcı olur.
Güncelleme: kod nasıl düzeltilebilir:
Tamam - "source" değişkeninizde bazı baytlar var. Sorunuzdan oraya nasıl girdikleri anlaşılmıyor - belki de onları bir web formundan okudunuz? Her durumda, ascii ile kodlanmamışlar, ancak python öyle olduklarını varsayarak onları unicode'a dönüştürmeye çalışıyor. Kodlamanın ne olduğunu açıkça söylemeniz gerekir. Bu, kodlamanın ne olduğunu bilmeniz gerektiği anlamına gelir! Bu her zaman kolay değildir ve tamamen bu dizginin nereden geldiğine bağlıdır. Bazı yaygın kodlamaları deneyebilirsiniz - örneğin UTF-8. unicode() fonksiyonuna ikinci bir parametre olarak kodlamayı söylersiniz:
source = unicode(source, 'utf-8')
Bazı durumlarda, varsayılan kodlamanızı kontrol ettiğinizde (print sys.getdefaultencoding()
), ASCII kullandığınızı döndürür. UTF-8 olarak değiştirirseniz, değişkeninizin içeriğine bağlı olarak çalışmaz.
Başka bir yol buldum:
import sys
reload(sys)
sys.setdefaultencoding('Cp1252')