有人能解释一下python为什么有这种行为吗?在
让我解释一下。在
背景
我有一个python安装,我想使用一些不在ASCII表中的字符。
所以我改变了python的默认编码。
我将每个字符串保存到一个file.py中,这样'_MAIL_TITLE_': u'Бронирование номеров',
现在,有了一个替换字典键的方法,我想以动态的方式将字符串插入到html模板中。在
我在html页面的标题中放置:
......
不幸的是,我的html文档(在这些替换之后)被一些错误的字符(未转换?误解了吗?)在
所以,我打开一个终端开始订购:
^{pr2}$
问题
看看第[7-10]行。
这不是很奇怪吗?为什么如果我的(第6行)python有一个defaultencoding utf-8,那么它是否以与第9行不同的方式转换该字符串(第7行)?
现在,看看行[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'
所以,编码(显式编码)独立于输入编码工作(或者在我看来,但是我已经坚持了好几天了,所以可能我把脑子搞乱了)。在
解决方案在哪里??
通过查看background和hint的第8行,可以看到所创建的unicode对象有一些不同之处。
所以,我开始考虑这个问题。
我得出了什么结论?没有什么。
除了,也许我的编码问题是在save my.py(包含必须插入到html文档中的所有utf-8字符)之后,我的编码问题就变成了到文件的编码中了
“真实”代码
这段代码没有什么特别之处:它打开一个html模板,将其放入一个字符串中,用unicode(utf-8ed?)替换占位符?希望是)字符串,并将其保存到另一个文件中,该文件将从互联网上可视化(是的,我的“登陆”页面已经进入了标题utf-8的规范中)。
我这里没有代码,因为它分散在几个文件中,但是我可以确定程序的工作流程(通过跟踪它)。在
最后一个问题
有鉴于此,有人知道如何让我的代码工作吗?
关于unix文件编码的想法?还是.py文件编码?
如何更改编码以使代码正常工作?在
最后提示
在用utf-8对象替换占位符之前,如果我插入utf8Obj.encode('latin-1')
我的文档在互联网上完全可见!在
感谢那些回答的人。在
EDIT1-开发工作流
好吧,这就是我的开发流程:
我有那个项目的简历。该项目位于centos上。那台服务器是一台64位机器。
我用eclipse将代码开发成windows7(64位)。
每个修改只在CVS commit中提交。
在使用这种python的Centos机器上,代码是execute的: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页面通过WS调用位于Zope/Plone“服务器”上的一些python方法(应用程序逻辑)。该服务器直接与应用程序逻辑接口。在
仅此而已
编辑2
这是执行替换的函数: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)