Может кто-нибудь объяснить мне, почему Python имеет такое поведение?
Позвольте мне объяснить.
ПРЕДПОСЫЛКИ
У меня есть установка Python и яхочу использовать некоторые символы, которых нет в таблице ASCII.Таким образом, я изменяю свой python по умолчанию.Я сохраняю каждую строку в файле .py таким образом '_MAIL_TITLE_': u'Бронирование номеров',
Теперь, с помощью метода, который заменяет ключи моего словаря, я хочу динамически вставлять в шаблон html мои строки.
Я помещаю в заголовок HTML-страницы:
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
...... <!-- Some Css's -->
</head>
К сожалению, мой HTML-документ приходит ко мне (после замены) с некоторыми неправильными символами (не преобразованными? Неправильно преобразованными?)
Итак, я открываю терминал и начинаю делать заказ:
1 - Python 2.4.6 (#1, Jan 27 2012, 15:41:03)
2 - [GCC 4.1.2 20080704 (Red Hat 4.1.2-51)] on linux2
3 - Type "help", "copyright", "credits" or "license" for more information.
4 - >>> import sys
5 - >>> sys.getdefaultencoding()
6 - 'utf-8'
7 - >>> u'èéòç'
8 - u'\xe8\xe9\xf2\xe7'
9 - >>> u'èéòç'.encode('utf-8')
10 - '\xc3\xa8\xc3\xa9\xc3\xb2\xc3\xa7'
11 - >>> u'è'
12 - u'\xe8'
13 - >>> u'è'.encode()
14 - '\xc3\xa8'
ВОПРОС
Взгляните на строку [7-10].Разве это не странно?Почему, если мой python (строка 6) имеет код по умолчанию utf-8
, он преобразует эту строку (line7) не так, как строка 9?Теперь взгляните на строки [11-14] и их вывод.
Теперь я в полном замешательстве!
Подсказка
Итак, я попытался изменить свой способ ввода входных файлов (ранее ISO-8859-1 , теперь utf-8 ) и что-то изменилось:
1 - Python 2.4.6 (#1, Jan 27 2012, 15:41:03)
2 - [GCC 4.1.2 20080704 (Red Hat 4.1.2-51)] on linux2
3 - Type "help", "copyright", "credits" or "license" for more information.
4 - >>> import sys
5 - >>> sys.getdefaultencoding()
6 - 'utf-8'
7 - >>> u'èéòç'
8 - u'\xc3\xc3\xa8\xc3\xa9\xc3\xb2\xc3\xa7'
9 - >>> u'èéòç'.encode('utf-8')
10 - '\xc3\xa8\xc3\xa9\xc3\xb2\xc3\xa7'
11 - >>> u'è'
12 - u'\xe8'
13 - >>> u'è'.encode()
14 -'\xc3\xa8'
Итак, кодировка (явное кодирование) работает независимо от входной кодировки (или мне кажется, но я застрял на этом на несколько дней, так что, возможно, я запутался).
ГДЕ РЕШЕНИЕ ??
Глядя на строки 8 из background
и hint
, вы можете увидеть, что существуют некоторые отличия созданного объекта Unicode.Итак, я начал думать об этом.Что я сделал вывод?Ничего такого.Ничего, кроме того, что, может быть, мои проблемы с кодировкой - это в кодировку файла, как только сохранить мой .py (который содержит все символы utf-8, которые должны быть вставлены в HTML-документ)
«РЕАЛЬНЫЙ» КОД
Код не делает ничего особенного: он открывает HTML-шаблон, помещает его в строку, заменяет заполнители на строки Юникода (utf-8ed? Wish yes) и сохраняетэто в другой файл, который будет визуализирован из Интернета (да, моя «целевая» страница содержит спецификации заголовка utf-8).У меня нет кода здесь, потому что он разбит на несколько файлов, но я уверен в рабочем процессе программы (отслеживая его).
ЗАКЛЮЧИТЕЛЬНЫЙ ВОПРОС
В свете этого, есть ли у кого-нибудь идея заставить мой код работать?Идеи о кодировке Unix файлов?Или .py кодировка файла?Как я могу изменить кодировку, чтобы мой код работал?
LAST HINT
Перед заменой заполнителей на объект utf-8, если я вставлю
utf8Obj.encode('latin-1')
мой документ отлично виден для Интернета!
Спасибо тем, кто отвечает.
РЕДАКТИРОВАТЬ1 - РАБОЧИЙ ПРОЦЕСС РАЗРАБОТКИ
ОКВот мой рабочий процесс разработки:
У меня есть CVS для этого проекта.Проект расположен на ОС Centos.Этот сервер является 64-битной машиной.Я разрабатываю свой код в Windows 7 (64-разрядная версия) с затмением.Каждая модификация совершается ТОЛЬКО с фиксацией CVS.Код распространяется на машину Centos, которая использует этот тип Python:
Python 2.4.6 (#1, Jan 27 2012, 15:41:03)
[GCC 4.1.2 20080704 (Red Hat 4.1.2-51)] on linux2
Я настроил Eclipse для работы таким образом: ПРЕДПОЧТЕНИЯ -> ОБЩИЕ -> РАБОЧЕЕ МЕСТО -> КОДИРОВАНИЕ ТЕКСТА ФАЙЛА: UTF-8
Приложение Zope / Plone запускается на том же сервере: оно обслуживает некоторые страницы PHP.Страницы PHP вызывают некоторые методы Python (логику приложения) от WS, которые расположены на «сервере» Zope / Plone.Интерфейс этого сервера напрямую связан с логикой приложения.
Вот и все
EDIT2
Эта функция заменяет:
def _fillTemplate(self, buf):
"""_fillTemplate(buf)-->str
Ritorna il documento con i campi sostituiti con dict_template.
"""
try:
for k, v in self.dict_template.iteritems():
if not isinstance(v,unicode):
v=str(v)
else:
v=v.encode('latin-1') #In that way it works, but why?
buf = buf.replace(k, v)