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!
Comment le réparer ?
Dans d'autres applications de blog statique basées sur python, l'article chinois peut être publié avec succès. Comme cette application : http://github.com/vrypan/bucket3. Sur mon site http://bc3.brite.biz/, les messages en chinois peuvent être publiés avec succès.
Finalement je l'ai eu:
as3:/usr/local/lib/python2.7/site-packages# cat sitecustomize.py
# encoding=utf8
import sys
reload(sys)
sys.setdefaultencoding('utf8')
Laissez-moi vérifier:
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'
>>>
Ce qui précède montre que l'encodage par défaut de python est utf8
. Alors l'erreur n'existe plus.
C'est le problème classique de l'unicode. Je pense que l'explication de ce problème dépasse le cadre d'une réponse StackOverflow pour expliquer complètement ce qui se passe.
Le problème est bien expliqué [ici][1].
En résumé, vous avez transmis quelque chose qui est interprété comme une chaîne d'octets à quelque chose qui doit la décoder en caractères Unicode, mais le codec par défaut (ascii) échoue.
La présentation que je vous ai indiquée fournit des conseils pour éviter cela. Faites de votre code un "sandwich unicode" ;. Dans Python 2, l'utilisation de from __future__ import unicode_literals
aide.
[1] : http://nedbatchelder.com/text/unipain.html
Mise à jour : comment le code peut être corrigé :
OK - dans votre variable "source" ; vous avez quelques octets. Votre question n'indique pas clairement comment ils sont arrivés là - peut-être les avez-vous lus à partir d'un formulaire Web ? Dans tous les cas, ils ne sont pas codés en ascii, mais python essaie de les convertir en unicode en supposant qu'ils le sont. Vous devez lui indiquer explicitement quel est l'encodage. Cela signifie que vous devez savoir quel est l'encodage ! Ce n'est pas toujours facile, et cela dépend entièrement de la provenance de cette chaîne. Vous pouvez expérimenter avec certains encodages courants, par exemple UTF-8. Vous indiquez à unicode() l'encodage comme deuxième paramètre :
source = unicode(source, 'utf-8')
Dans certains cas, lorsque vous vérifiez votre encodage par défaut (print sys.getdefaultencoding()
), il retourne que vous utilisez l'ASCII. Si vous passez en UTF-8, cela ne fonctionne pas, selon le contenu de votre variable.
J'ai trouvé un autre moyen :
import sys
reload(sys)
sys.setdefaultencoding('Cp1252')