Kā labot: "UnicodeDecodeError: 'ascii' kodeks nevar dekodēt baitu"

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!

Kā to novērst?

Dažās citās python bāzētās statiskajās emuāru lietotnēs ķīniešu ziņu var veiksmīgi publicēt. Piemēram, šī lietotne: http://github.com/vrypan/bucket3. Manā vietnē http://bc3.brite.biz/ ķīniešu ziņu var veiksmīgi publicēt.

Konīgi es to sapratu:

as3:/usr/local/lib/python2.7/site-packages# cat sitecustomize.py
# encoding=utf8  
import sys  

reload(sys)  
sys.setdefaultencoding('utf8')

Atļaujiet man pārbaudīt:

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)

>>> sys.getdefaultencoding()
'utf8'
>>>

Iepriekš redzams, ka python noklusējuma kodējums ir utf8. Tad kļūdas vairs nav.

Komentāri (14)

Tas ir klasisks "Unicode jautājums". Es uzskatu, ka tā izskaidrošana pārsniedz StackOverflow atbildes apjomu, lai pilnībā izskaidrotu, kas notiek.

Tas ir labi izskaidrots šeit.

Ļoti īsā kopsavilkumā, jūs esat nodevis kaut ko, kas tiek interpretēts kā baitu virkne, kaut kam, kam tas ir jāatkodē Unicode rakstzīmēs, bet noklusējuma kodeks (ascii) nedarbojas.

Prezentācijā, uz kuru es jums norādīju, ir sniegts padoms, kā no tā izvairīties. Izveidojiet savu kodu kā "Unicode sviestmaizi". Python 2 palīdz from __future__ import unicode_literals izmantošana.

Atjauninājums: kā kodu var labot:

avota"source" mainīgajā ir daži baiti. No jūsu jautājuma nav skaidrs, kā tie tur nokļuvuši - varbūt jūs tos nolasījāt no tīmekļa veidlapas? Jebkurā gadījumā tie nav kodēti ar ascii, bet python mēģina tos konvertēt uz unicode, pieņemot, ka tie ir kodēti. Jums ir skaidri jānorāda, kāda ir kodēšana. Tas nozīmē, ka jums jāzina, kāda ir kodēšana! Tas ne vienmēr ir vienkārši, un tas ir atkarīgs tikai no tā, no kurienes šī virkne ir iegūta. Varat eksperimentēt ar dažām izplatītākajām kodēšanas formām, piemēram, UTF-8. Otrajā parametrā norādiet unicode() kodējumu:

source = unicode(source, 'utf-8')
Komentāri (11)

Dažos gadījumos, pārbaudot noklusējuma kodējumu (print sys.getdefaultencoding()), tiek parādīts, ka tiek izmantots ASCII. Ja maināt uz UTF-8, tas nedarbojas atkarībā no jūsu mainīgā satura. Es atradu citu veidu:

import sys
reload(sys)  
sys.setdefaultencoding('Cp1252')
Komentāri (4)