Python / Mako: Как правильно проанализировать строки / символы Юникода? - PullRequest
3 голосов
/ 19 сентября 2010

Я пытаюсь заставить Мако визуализировать некоторую строку с символами Юникода:

tempLook=TemplateLookup(..., default_filters=[], input_encoding='utf8',output_encoding='utf-8', encoding_errors='replace')
...
print sys.stdout.encoding
uname=cherrypy.session['userName']
print uname
kwargs['_toshow']=uname
...
return tempLook.get_template(page).render(**kwargs)

Связанный файл шаблона:

...${_toshow}...

И вывод:

UTF-8
Deşghfkskhü
...
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc5 in position 1: ordinal not in range(128)

Я не думаю, что есть какая-то проблема с самой строкой, поскольку я могу напечатать ее очень хорошо.

Хотя я играл (много) с параметрами input/output_encoding и default_filters, этовсегда жалуется на неспособность декодировать / кодировать с помощью кодека ascii.

Поэтому я решил попробовать пример, найденный в документации , и следующее работает «лучше»:

input_encoding='utf-8', output_encoding='utf-8'
#(note : it still raised an error without output_encoding, despite tutorial not implying it) 

С

${u"voix m’a réveillé."} 

И результатом является

voix mâ�a réveillé

Я просто не понимаю, почему это не работает.«Волшебный кодировочный комментарий» тоже не работает.Все файлы имеют кодировку UTF-8.

Я часами безрезультатно, я что-то упустил?

Обновление:

Теперь у меня есть более простой вопрос:

Теперь, когда все переменные являются Unicode, как я могу заставить Mako отображать строки Unicode без применения чего-либо?Передача пустого фильтра / render_unicode () не помогает.

1 Ответ

3 голосов
/ 19 сентября 2010

Да, UTF-8! = Unicode.

UTF-8 - это заданное строковое кодирование, равно как и ASCII и ISO 8859-1.Попробуйте это:

Для любой входной строки выполните inputstring.decode('utf-8') (или любую полученную вами кодировку).Для любой выходной строки сделайте outputstring.encode('utf-8') (или любую другую выходную кодировку).Для любого внутреннего использования возьмите строки Unicode ('this is a normal string'.decode('utf-8') == u'this is a normal string')

'foo' - строка, u'foo' - строка Unicode, которая не имеет «кодировки» (не может быть декодирована),Поэтому каждый раз, когда Python хочет изменить кодировку нормальной строки, он сначала пытается «декодировать» его, чтобы «кодировать» его.И по умолчанию «ascii», который чаще всего дает сбой: -)

...