Мои веб-страницы обслуживаются скриптом, который динамически импортирует кучу файлов с
try:
with open (filename, 'r') as f:
exec(f.read())
except IOError: pass
(на самом деле, вы можете предложить лучший способ импорта файла? Я уверен, что есть один.)
Иногда файлы имеют строки на разных языках, например
# contents of language.ru
title = "Название"
Все они были сохранены в виде файлов UTF-8. У Python нет проблем с запуском скрипта в командной строке или с обслуживанием страницы из моего MacBook:
OK: [server command line] python3.0 page.py /index.ru
OK: http://whitebox.local/index.ru
но выдает ошибку при попытке отправить страницу с сервера, на который мы только что перешли:
157 try:
158 with open (filename, 'r') as f:
159 exec(f.read())
160 except IOError: pass
161
/usr/local/lib/python3.0/io.py in read(self=, n=-1)
...
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe1 in position 627: ordinal not in range(128)
Все файлы были скопированы с моего ноутбука, где они отлично обслуживались Apache. В чем причина?
Обновление: Я обнаружил, что кодировка по умолчанию для open()
зависит от платформы, поэтому она была utf8
на моем ноутбуке и ascii
на сервере. Интересно, есть ли функция для каждой программы для ее установки в Python 3 (sys.setdefaultencoding
используется в модуле site
, а затем удаляется из пространства имен).