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!
Ako to opraviť?
V niektorých iných statických blogových aplikáciách založených na jazyku python možno čínsky príspevok úspešne publikovať. Ako napríklad táto aplikácia: http://github.com/vrypan/bucket3. Na mojej stránke http://bc3.brite.biz/ možno čínsky príspevok úspešne publikovať.
Nakoniec som to pochopil:
as3:/usr/local/lib/python2.7/site-packages# cat sitecustomize.py
# encoding=utf8
import sys
reload(sys)
sys.setdefaultencoding('utf8')
Nechajte ma skontrolovať:
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'
>>>
Z vyššie uvedeného vyplýva, že predvolené kódovanie jazyka python je utf8
. Potom už chyba nie je.
Ide o klasický "problém s unikódmi". Verím, že vysvetliť to je nad rámec odpovede na StackOverflow, aby sa úplne vysvetlilo, čo sa deje.
Je to dobre vysvetlené tu.
Veľmi stručne povedané, odovzdali ste niečo, čo sa interpretuje ako reťazec bajtov, niečomu, čo to potrebuje dekódovať na znaky Unicode, ale predvolený kodek (ascii) zlyháva.
Prezentácia, na ktorú som vás odkázal, poskytuje rady, ako sa tomu vyhnúť. Vytvorte z vášho kódu "sendvič Unicode". V Pythone 2 pomáha použitie príkazu from __future__ import unicode_literals
.
Aktualizácia: ako sa dá kód opraviť:
V premennej "source" máte niekoľko bajtov. Z vašej otázky nie je jasné, ako sa tam dostali - možno ste ich načítali z webového formulára? V každom prípade nie sú kódované ascii, ale python sa ich snaží previesť na unicode v domnienke, že sú. Musíte mu explicitne povedať, aké je kódovanie. To znamená, že musíte vedieť, aké je kódovanie! To nie je vždy jednoduché a úplne to závisí od toho, odkiaľ tento reťazec pochádza. Môžete experimentovať s niektorými bežnými kódovaniami - napríklad UTF-8. Kódovanie oznámite funkcii unicode() ako druhý parameter:
source = unicode(source, 'utf-8')
V niektorých prípadoch sa pri kontrole predvoleného kódovania (print sys.getdefaultencoding()
) vráti, že používate ASCII. Ak ho zmeníte na UTF-8, nefunguje to'v závislosti od obsahu vašej premennej.
Našiel som iný spôsob:
import sys
reload(sys)
sys.setdefaultencoding('Cp1252')