有人可以向我解释为什么 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] 行。这不是很奇怪吗?为什么如果我的(第 6 行)python 有一个utf-8
defaultencoding ,它会以与第 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'
因此,编码(显式编码)独立于输入编码工作(或者在我看来,但我坚持了好几天,所以也许我搞砸了)。
解决方案在哪里?
通过查看 和 的第 8 行background
,hint
您可以看到创建的 unicode 对象存在一些差异。所以,我已经开始考虑了。我得出了什么结论?没有什么。除了保存我的 .py (包含必须插入到 html 文档中的所有 utf-8 字符)后,我的编码问题可能会出现在文件的编码中。
“真实”密码
该代码没有什么特别之处:它打开一个 html 模板,将其放入字符串中,用 unicode(utf-8ed ?希望是)字符串替换占位符,并将其保存到另一个文件中,该文件将从 Internet 可视化(是的,我的“登陆”页面已进入标题 utf-8 的规范)。我这里没有代码,因为它分散在几个文件中,但我确定程序的工作流程(通过跟踪它)。
最后一个问题
有鉴于此,有人知道让我的代码工作吗?关于unix文件编码的想法?还是 .py 文件编码?如何更改编码以使我的代码正常工作?
最后提示
在用 utf-8 对象替换占位符之前,如果我插入一个
utf8Obj.encode('latin-1')
我的文档在互联网上完全可见!
感谢那些回答的人。
EDIT1 - 开发工作流程
好的,这就是我的开发工作流程:
我有那个项目的 CVS。该项目位于 centos 操作系统上。该服务器是 64 位机器。我使用 Eclipse 将我的代码开发成 Windows 7(64 位)。每次修改都只能通过 CVS 提交来提交。该代码在使用这种 python 的 Centos 机器上执行:
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 工作:PREFERENCES -> GENERAL -> WORKSPACE -> TEXT FILE ENCODING : UTF-8
Zope/Plone 应用程序运行在同一台服务器上:它为一些 PHP 页面提供服务。PHP 页面通过位于 Zope/Plone“服务器”上的 WS 调用一些 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)