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!
Hvordan fikse det?
I noen andre python-baserte statiske bloggapper kan kinesiske innlegg publiseres. Slik som denne appen: http://github.com/vrypan/bucket3. På nettstedet mitt http://bc3.brite.biz/ kan kinesisk innlegg publiseres vellykket.
Endelig fikk jeg det:
as3:/usr/local/lib/python2.7/site-packages# cat sitecustomize.py
# encoding=utf8
import sys
reload(sys)
sys.setdefaultencoding('utf8')
La meg sjekke:
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'
>>>
Ovenstående viser at standard koding av python er utf8
. Da er ikke feilen lenger.
Dette er det klassiske "unicode-problemet". Jeg tror at å forklare dette er utenfor omfanget av et StackOverflow-svar for å forklare fullstendig hva som skjer.
Det er godt forklart her.
I veldig kort oppsummering har du sendt noe som blir tolket som en streng med byte til noe som trenger å dekode det til Unicode-tegn, men standardkodeken (ascii) mislykkes.
Presentasjonen jeg pekte deg til gir råd for å unngå dette. Gjør koden din til en "unicode-sandwich". I Python 2 hjelper bruken av from __future__ import unicode_literals
.
Oppdatering: hvordan kan koden fikses:
OK - i variabelen din "source" har du noen byte. Det er ikke klart fra spørsmålet ditt hvordan de kom inn der - kanskje du leser dem fra et nettskjema? I alle fall er de ikke kodet med ascii, men python prøver å konvertere dem til unicode forutsatt at de er det. Du må eksplisitt fortelle den hva kodingen er. Dette betyr at du må vite hva kodingen er! Det er ikke alltid lett, og det kommer helt an på hvor denne strengen kommer fra. Du kan eksperimentere med noen vanlige kodinger - for eksempel UTF-8. Du forteller unicode() kodingen som en andre parameter:
source = unicode(source, 'utf-8')
I noen tilfeller, når du sjekker standardkodingen din (print sys.getdefaultencoding()
), returnerer den at du bruker ASCII. Hvis du endrer til UTF-8, fungerer det ikke, avhengig av innholdet i variabelen din.
Jeg fant en annen måte:
import sys
reload(sys)
sys.setdefaultencoding('Cp1252')