【发布时间】:2012-03-26 18:11:47
【问题描述】:
有人可以向我解释为什么 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,它会以与第 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 对象存在一些差异。
所以,我已经开始考虑了。
我得出了什么结论?没有。
除了保存我的 .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 方法(应用程序逻辑)。该服务器直接连接到应用程序逻辑。
就是这样
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)
【问题讨论】:
-
像往常一样,首先要检查的是编码链是否在某处损坏。你用什么编辑器?是否设置为将文件保存为 UTF8 或 Latin-1 ?您的 HTML 页面的编码是什么(不是标题,保存了带有女巫的编码)。 python代码文件的编码是什么?你是否将python文件编码头设置为utf8?
-
@e-satis :我使用 eclipse(和 cvs 来提交我的代码),它被设置为在 utf-8 中工作。我的 html 页面也是用 eclipse 编写的。 python代码文件的编码对我来说是一个谜。我怎样才能找回它?最后一个答案也适用于最后一个问题
-
您是否编写了 Python 代码文件?如果是,您必须知道编码,因为您编写了它。如果你用eclipse写的话,它可能是utf8。如果你没有,那么你不能在不知道编码的情况下使用它。
-
显然,我编写了自己的代码。但奇怪的是,如果我更改文件的编码(来自 eclipse)并想将其提交回存储库,我的 CVS 对我说从 REP.FILE 到 LOC.FILE 没有任何区别。此外,您如何解释“最后提示”部分?
-
你的意思是你的机器上没有服务器设置?您不能在本地计算机上解雇 Python 解释器吗?那你在哪里写代码,在windows上?哪个版本?哪种编码?不,这不仅仅是“驱使我去“什么编码有[你的] .py 文件”的信息。它是一个额外的层。所以额外的复杂性。每次添加一个带有编码的层时,都会为错误添加另一个机会。请添加您在 OP 中的所有工作流程。
标签: python character-encoding file-encodings