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!
Wie kann man das beheben?
In einigen anderen python-basierten statischen Blog-Apps können chinesische Beiträge erfolgreich veröffentlicht werden. Wie zum Beispiel diese Anwendung: http://github.com/vrypan/bucket3. Auf meiner Website http://bc3.brite.biz/ können chinesische Beiträge erfolgreich veröffentlicht werden.
Endlich habe ich es geschafft:
as3:/usr/local/lib/python2.7/site-packages# cat sitecustomize.py
# encoding=utf8
import sys
reload(sys)
sys.setdefaultencoding('utf8')
Lassen Sie mich nachsehen:
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'
>>>
Die obige Darstellung zeigt, dass die Standardkodierung von Python utf8
ist. Dann ist der Fehler nicht mehr vorhanden.
Dies ist das klassische "Unicode Problem". Ich glaube, dass es den Rahmen einer StackOverflow-Antwort sprengen würde, vollständig zu erklären, was hier passiert.
Es ist gut erklärt hier.
In sehr kurzer Zusammenfassung haben Sie etwas, das als eine Zeichenfolge von Bytes interpretiert wird, an etwas übergeben, das es in Unicode-Zeichen dekodieren muss, aber der Standard-Codec (ascii) versagt.
Die Präsentation, auf die ich Sie hingewiesen habe, enthält Ratschläge, wie Sie dies vermeiden können. Machen Sie aus Ihrem Code ein "Unicode-Sandwich". In Python 2 hilft die Verwendung von from __future__ import unicode_literals
.
Update: wie kann der Code korrigiert werden:
OK - in Ihrer Variable "source" haben Sie einige Bytes. Aus Ihrer Frage geht nicht hervor, wie sie dort hineingekommen sind - vielleicht haben Sie sie aus einem Webformular gelesen? Auf jeden Fall sind sie nicht mit ascii kodiert, aber Python versucht, sie in Unicode zu konvertieren, in der Annahme, dass sie es sind. Sie müssen ihm explizit sagen, was die Kodierung ist. Das bedeutet, dass Sie wissen müssen, wie die Kodierung lautet! Das ist nicht immer einfach, und es hängt ganz davon ab, woher die Zeichenkette stammt. Sie könnten mit einigen gängigen Kodierungen experimentieren - zum Beispiel UTF-8. Sie teilen unicode() die Kodierung als zweiten Parameter mit:
source = unicode(source, 'utf-8')
Wenn Sie Ihre Standardkodierung überprüfen (print sys.getdefaultencoding()
), wird in einigen Fällen zurückgegeben, dass Sie ASCII verwenden. Wenn Sie zu UTF-8 wechseln, funktioniert es nicht, je nach dem Inhalt Ihrer Variablen.
Ich habe einen anderen Weg gefunden:
import sys
reload(sys)
sys.setdefaultencoding('Cp1252')