При работе с Django во время записи русского текста в кодировке UTF-8 в файл может возникнуть исключение вида
UnicodeEncodeError: 'ascii' codec can't encode character u'\xa1'
in position 0: ordinal not in range(128)
Такое исключение в Django может возникнуть, например, при выполнении такого кода:
#-*- coding: utf-8 -*-
import os
from django.template import Template, Context, loader
from django.http import HttpResponse
def write_file(request):
pathToFile = os.path.join(os.path.dirname(__file__), 'files/newtext.txt')
file = open(pathToFile, 'w')
text_for_file = u'Привет! Я новый файл!'
file.write(text_for_file)
file.close()
file = open(pathToFile, 'r')
text_from_file = file.read()
file.close()
t = loader.get_template('filework.html')
c = Context({'text': text_from_file})
renderedTemplate = t.render(c)
return HttpResponse(renderedTemplate)
Для устранения данной проблемы можно воспользоваться функцией smart_str(), имеющейся в Django, внеся в наш пример следующие две добавки:
#-*- coding: utf-8 -*-
import os
from django.template import Template, Context, loader
from django.http import HttpResponse
from django.utils.encoding import smart_str, smart_unicode
def open_file(request):
pathToFile = os.path.join(os.path.dirname(__file__), 'files/mytext.txt')
file = open(pathToFile, 'r')
text_from_file = file.read()
file.close()
t = loader.get_template('filework.html')
c = Context({'text': text_from_file})
renderedTemplate = t.render(c)
return HttpResponse(renderedTemplate)
def write_file(request):
pathToFile = os.path.join(os.path.dirname(__file__), 'files/newtext.txt')
file = open(pathToFile, 'w')
text_for_file = u'Привет! Я новый файл!'
file.write(smart_str(text_for_file))
file.close()
file = open(pathToFile, 'r')
text_from_file = file.read()
file.close()
t = loader.get_template('filework.html')
c = Context({'text': text_from_file})
renderedTemplate = t.render(c)
return HttpResponse(renderedTemplate)
Комментариев нет:
Отправить комментарий