Kaip ištaisyti: "UnicodeDecodeError: 'ascii' codec can't decode byte"

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!

Kaip tai ištaisyti?

Kai kuriose kitose pythonu paremtose statinėse tinklaraščio programose kinų įrašą galima sėkmingai paskelbti. Pavyzdžiui, ši programa: http://github.com/vrypan/bucket3. Mano svetainėje http://bc3.brite.biz/ kinų postą galima sėkmingai paskelbti.

Galiausiai aš tai supratau:

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

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

Tikrinu:

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'
>>>

Iš aukščiau pateiktų duomenų matyti, kad numatytoji "Python" koduotė yra utf8. Tada klaidos nebėra.

Komentarai (14)

Tai yra klasikinė "unikodo problema". Manau, kad tai paaiškinti nėra StackOverflow atsakymo apimtis, kad būtų galima visiškai paaiškinti, kas vyksta.

Tai gerai paaiškinta čia.

Labai trumpai apibendrinant, jūs perdavėte kažką, kas interpretuojama kaip baitų eilutė, kažkam, kas turi ją iššifruoti į Unicode simbolius, tačiau numatytasis kodekas (ascii) nepavyksta.

Pristatyme, į kurį jus nukreipiau, pateikiama patarimų, kaip to išvengti. Padarykite savo kodą "Unicode sumuštiniu". Python 2 programoje padeda from __future__ import unicode_literals.

Atnaujinimas: kaip galima ištaisyti kodą:

šaltinio"source" kintamajame yra keletas baitų. Iš jūsų klausimo neaišku, kaip jie ten pateko - gal perskaitėte juos iš žiniatinklio formos? Bet kokiu atveju jie nėra užkoduoti ascii kodu, tačiau python bando juos konvertuoti į unicode, manydamas, kad taip ir yra. Turite aiškiai nurodyti, kokia yra koduotė. Tai reiškia, kad turite žinoti, kokia yra koduotė! Tai ne visada lengva, be to, tai visiškai priklauso nuo to, iš kur ši eilutė atsirado. Galite paeksperimentuoti su kai kuriomis įprastomis koduotėmis, pavyzdžiui, UTF-8. Kaip antrąjį parametrą unicode() nurodote koduotę:

source = unicode(source, 'utf-8')
Komentarai (11)

Kai kuriais atvejais, kai tikrinate numatytąją koduotę (print sys.getdefaultencoding()), grąžinama, kad naudojate ASCII. Jei pakeisite į UTF-8, tai neveikia, priklausomai nuo kintamojo turinio. Radau kitą būdą:

import sys
reload(sys)  
sys.setdefaultencoding('Cp1252')
Komentarai (4)