Кодировка символов Мьянмы в Python 3.4
UnicodeEncodeError 'charmap' codec can't encode characters in position 1-12
Я получаю эту ошибку при попытке вставить строку на языке Мьянма в шаблон Jinja2 и сохранить шаблон. Я установил все необходимые шрифты в ОС, попытался использовать codec
Lib. Скрипт psocess: python анализирует файл CSV с данными, затем создает словарь, и этот словарь затем используется для заполнения переменных, используемых в шаблоне Jinja2, значениями. Ошибка возникает в момент записи в файл. Использование Python 3.4. Есть пакет под названием python-myanmar
но это для 2.7 и я не хочу понижать свой собственный код. Прочитайте уже все это: http://www.unicode.org/notes/tn11/, http://chimera.labs.oreilly.com/books/1230000000393/ch02.html, https://code.google.com/p/python-myanmar/ package и установленные системные шрифты. Я могу закодировать строку в .encode('utf-8')
, но не могу тогда .decode()
без ошибки! Вопрос в том, как можно не понизить код, возможно, установить что-то дополнительное, но лучше всего использовать только встроенные функции python 3.4 для записи данных в файл?
C:\Users\...\autocrm.py in create_templates(csvfile_location, csv_delimiter, template_location, count
ies_to_update, push_onthefly, csv_gspreadsheet, **kwargs)
270 ### use different parsers for ventures due to possible difference in website design
271 ### checks if there is a link in CSV/TSV
--> 272 if variables['promo_link'] != '':
273 article_values = soup_the_newsletter_article(variables['promo_link'])
274 if variables['item1_link'] != '':
C:\Users\...\autocrm.py in push_to_ums(countries_to_update, html_template, **kwargs)
471 ### save to import.xml
472 with open(xml_path_upload, 'w') as writefile:
--> 473 writefile.write(template.render(**values))
474 print('saved the import.xml')
475
C:\Python34\lib\encodings\cp1252.py in encode(self, input, final)
17 class IncrementalEncoder(codecs.IncrementalEncoder):
18 def encode(self, input, final=False):
---> 19 return codecs.charmap_encode(input,self.errors,encoding_table)[0]
20
21 class IncrementalDecoder(codecs.IncrementalDecoder):
UnicodeEncodeError: 'charmap' codec can't encode characters in position 6761-6772: character maps to <undefined>
Кстати, почему он указывает на cp1251.py, если мой sys.getdefaultencoding()
выходной UTF8??
with open(template_location, 'r') as raw_html:
template = Template(raw_html.read())
print('writing to template: ' + variables['country_id'])
# import ipdb;ipdb.set_trace()
with open('rendered_templates_L\\NL_' +
variables['country_id'] + ".html", 'w', encoding='utf-8') as writefile:
rendered_template = template.render(**alldata)
writefile.write(rendered_template)
1 ответ
Вы открыли выходной файл без указания кодировки, поэтому используется системная кодировка по умолчанию; здесь CP1251.
Результат шаблона Jinja создает строку Unicode, которую необходимо кодировать, но системная кодировка по умолчанию не поддерживает создаваемые кодовые точки.
Решение состоит в том, чтобы выбрать эксплик кодека. Если вы создаете XML, UTF-8 является кодировкой по умолчанию и может обрабатывать все Unicode:
with open(xml_path_upload, 'w', encoding='utf8') as writefile:
writefile.write(template.render(**values))