2014-09-25 104 views
1

我在python中使用jinja2模板语言来显示一个网站。python解码/编码地狱(使用jinja2)

相关的源代码如下所示:

# -*- coding: utf-8 -*- 
    ... 
    template_values = {'name': u'abwärtz'} 
    template = jinja_environment.get_template('Home.html') 
    print(template.render(template_values)) 
    ... 

有趣的是,如果我使用:

template_values = {'name': u'abw_rtz'} 

一切工作只是完美!

根据jinja2 s documentation

...对于Jinja2的模板的默认编码被认为是 UTF-8。

...要明确使用Unicode字符串,您必须在字符串前加字母“0:u'Hänselund Gretel sagen Hallo”。这样,Python 将通过对来自当前Python模块的 字符编码的字符串进行解码来将该字符串存储为Unicode。如果没有编码 指定此默认为“ASCII”这意味着你不能使用任何非 ASCII标识符....

所以,只要使用u'äöü”,一切都应该工作,对不对?

这就是我得到:


template_values = {'name': unicode('abwärtz','utf-8') } 
UnicodeDecodeError: 'utf8' codec can't decode byte 0xe4 in position 3: invalid continuation byte 

template_values = {'name': u'abwärtz' } 
SyntaxError: (unicode error) 'utf8' codec can't decode byte 0xe4 in position 0: unexpected end of data 

template_values = {'name': unicode('abwärtz',"ISO-8859-1") } 
--> everything works just perfect! 

我在Windows 7和sys.getdefaultencoding()回报ASCII工作。

有人可以解释这种奇怪的行为吗? 我正在寻找一个解决方案,其中'名称':也处理中文或西里尔文字符。

+0

你用什么编辑器编写代码?假设我的回答是正确的,有人可能会告诉你如何正确配置几乎所有的编辑器,除了记事本(如果你是记事本,答案是停止这样做)。 – abarnert 2014-09-25 23:26:40

+0

我正在使用Notepad ++ – user1911091 2014-09-26 07:57:06

回答

2

问题很可能出现在用于保存此源文件的文本编辑器中。

源文件是编码字节。您的编辑必须决定如何存储该ä字符。在Windows上,许多文本编辑器会默认使用您的OEM代码页,这通常是称为代码页1252的拉丁语-1衍生词,而不是UTF-8。

如果向文件顶部添加一个编码声明,告诉Python字节是UTF-8,但这些字节不是真正的UTF-8,而是cp1252,Python会曲解它们,导致如果你幸运的话,如果你不是,那么难以追踪的mojibake会是UnicodeDecodeError

如果您已经在使用西里尔文或中文字符,问题可能会更加明显,因为尝试将中文字符保存为cp1252(无法处理中文字符)的文件可能会给您几乎所有编辑器都有警告或错误。但是将西欧字符保存为cp1252(可以处理它们)可能会默默地做错误的事情。 (有几个编辑器 - 尤其是emacs - 可以与Python分享他们的编码声明,所以如果你试图用# -*- coding: utf-8 -*-保存文件,它将会保存为UTF-8或者给你一个非常严厉的警告,但是大多数编辑器会不会有,你躺在你的编码声明的任何线索。)


你怎么能验证这是什么问题?

要做的最简单的事情是在十六进制编辑器中查看源文件(或者只需在二进制模式下打开它,并将它在Python脚本中进行hexlify,如果您愿意的话)。如果这真的是UTF-8,你应该看到类似:

61 62 77 c3 a4 72 74 7a a b w . . r t z 

而如果它是CP1252,你会看到:

61 62 77 e4 72 74 7a  a b w ? r t z 

的区别是两个c3 a4字节(UTF-8 'ä')与一个e4(拉丁语-1和cp1252,对于'ä')。


在任何情况下,有两种解决方法:

  • 确保您配置编辑器默认为UTF-8,和CP1252转换你的源文件为UTF-8。
  • 请勿在源中使用任何非ASCII字符;改为写u'abw\u00e4rtz'
0

这个讨论非常有启发性。谢谢大家的参与。

这里是我做过什么来解决我自己的例子:

  1. 下载并安装HXD,一个免费的十六进制编辑器。 (http://mh-nexus.de/en/downloads.php?product=HxD

  2. 使用HxD打开有问题的“文本”文件。

  3. 将Charset设置为DOS/IBM-ASCII。

  4. 目视检查奇数“字符”的“文本”。

  5. 将这些奇怪的“字符”替换为与您的要求兼容的字符。搜索/替换下拉工具对此非常有用。

  6. 完成后保存文件。