用django 模板中文显示乱码

编辑器 保存文件时,要指定utf-8编码. 然后 在 文件头 设置 encoding

在.py文件首行加上
#coding=UTF-8
就可以的,如果还不行,就用纪事本打开文件然后另存为是 选择用UTF-8编码
然后上传
Django的内核是UTF-8的编码方式所以要避免乱码请注意一下几点:
1.数据库中的编码方式要是UTF-8的。
2.代码中View里面的最上面加上
# -*-coding:utf-8 -*-
可以防止模板出现乱码
3.代码中出现中文字符的地方请在本代码文件的最上面加入
# -*-coding:utf-8 -*-
可以避免代码文件出现乱码。

做好三点Django就不会出现乱码了。
注:一位朋友问我的这个问题,我在网上也没有找到关于乱码比较系统的处理方法,所以写了这个blog希望对一些朋友有用途。如果这些方法还不管用,请留言。我们一块解决。
问题描述:
在两个地方使用了中文:一个是python源文件中,一个是html模板中。在用浏览器查看该页时出现乱码,形如:"????",但是将浏览器的编码改为gb2312或gbk是正常的(浏览器默认使用utf8编码)

python代码:
Python代码 复制代码
  1. #coding=utf-8   
  2.   
  3. from django.shortcuts import render_to_response   
  4.   
  5. address = [   
  6.     {'name':'张三''address':'地址一'},   
  7.     {'name':'李四''address':'地址二'}   
  8.     ]   
  9.   
  10. def index(request):   
  11.     return render_to_response('list.html', {'address':address})  
#coding=utf-8

from django.shortcuts import render_to_response

address = [
    {'name':'张三', 'address':'地址一'},
    {'name':'李四', 'address':'地址二'}
    ]

def index(request):
    return render_to_response('list.html', {'address':address})


html代码:
Html代码 复制代码
  1. <h2>通讯录</h2>  
  2. <table border="1">  
  3.   <tr><th>姓名</th><th>地址</th></tr>  
  4.   {% for user in address %}   
  5.   <tr>  
  6.   <td>{{ user.name }}</td>  
  7.   <td>{{ user.address }}</td>  
  8.   </tr>  
  9. {% endfor %}   
  10. </table>  
  11. 2008-06-06 jasongreen (高级程序员)
    html模板是用GBK编码写的


    html文件编码与浏览器的html编码必须一致

    可以用eclipse修改文件编码

 

Django:乱码问题之文本编码
2008-01-17 18:02

今天遇到一个乱码问题,怎么调都不对。
有一个文件article_list.html,直接打开没有问题。但是使用django的服务,进行模板替换之后总是很出现乱码。手工将编码改为简体中文可以正常显示。
但是无论我在article_list.html里面怎么修改,在head的meta中添加gb2312或utf-8仍不行。
    后来,发现article_list.html本身的编码是ANSI的,如果改变其编码为utf-8,文档本身就会出现乱码。这才发现与我使用的编辑器有关系。于是,新建一个utf-8的文件,然后将article_list.html的内容复制到这个文件里,发现竟然没有乱码。然后保存着新文件,并改名为article_list.html,总算解决了这个问题。
    不过这主要是编辑器的问题,可能由于我的编辑器对自动的编码转换支持不好。
哎,郁闷了我好长时间~~~经验问题
应该是这样吧:
  1. #-*-coding=cp936--*--
  2. print("你能看到我吗?")
复制代码

 

 

在你的工程文件夹下的SETTINGS.py中增加语句LANGUAGE_CODE = 'zh-CN'和DEFAULT_CHARSET = 'GB18030',其中的GB18030是你需要的中文编码,可以改成GB2312或GBK。然后设置你的网页编码为相同的编码格式。

 

 

在配置django时,经常遇到编码的问题,即中文显示成乱码的问题,我也是,现在终于知道解决方法了:
django的默认编码global_settings里定义的DEFAULT_CHARSET = UTF-8,也就是说django的编码是UTF-8的,如果你想要改为GB2312或者GBK只要在项目文件下的settings文件下添加 DEFAULT_CHARSET = GB2312就可以了。就不用在所有的py文件里都加coding=utf-8 或者 GB2312了,因为默认的编码就是UTF-8了。
但是问题还是存在,那么就是在网页中设置<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />。就没问题了。


其实有时候这样做了好是出现乱码,或因编码引起异常的话,就要注意了:你虽然改成<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />了,但是一定要将改网页文件以UTF-8的格式来保存。这才是关键。就好的方法就是使用DW来保存页面,如果使用记事本的话很有可能不是以UTF-8格式保存的。因为<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />只是表示文件要以UTF-8来编码,并不表示文件内容就是UTF-8编码格式的。


总结:
1.在settings里设置DEFAULT_CHARSET = UTF-8,必要是在py文件头加#coding=utf-8

2.在网页中添加<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />,最好使用DW来保存,否则可能不是以UTF-8的格式来保存的。

 

 

google关键字:python 中文 windows 乱码 utf-8
来源:点击进入
2007年12月10日 星期一 14:20

关键字:Python UTF-8 GBK 中文 乱码

估计入门时都会遇到的。我是在windows下用的Python25自带的IDLE编辑运行的,发现运行脚本得出的结果有一些中文显示是乱码,但有一些是正常的。百思不得其解。首先查看了一下源文件的编码格式,是UTF-8。经过搜索再搜索,调试再调试,也换了几个编译器,发现比IDLE还糟糕(可能需要进行encode设置)。问题终于解决了,一共花了俺将近5个小时,写在这里,希望遇到问题的人能搜索到这里,不再重犯。

乱码原因:
因为你的文件声明为utf-8,并且也应该是用utf-8的编码保存的源文件。但是windows的本地默认编码是cp936,也就是gbk编码,所以在控制台

直接打印utf-8的字符串当然是乱码了。

解决方法:
在控制台打印的地方用一个转码就ok了,打印的时候这么写:
print myname.decode('UTF-8').encode('GBK')

比较通用的方法应该是:
import sys
type = sys.getfilesystemencoding()
print myname.decode('UTF-8').encode(type)

 

 

字符串编码
python中默认编码是ASCII,可以通过以下方式设置和获取:


 

import sys
print sys.getdefaultencoding()
sys.setdefaultencoding(
' gbk ' )

但直到python重新启动后新的默认编码才会生效,我试了一下,setdefaultencoding总是会出错,没有这个属性。用dir看,确实没有,python版本是2.5,不知道是否被取消了。

使用print来输出时,python将内容传递给系统处理,windows会按照系统默认编码来输出。如果包含了中文,就要注意几点。

1 python代码文件的编码
py文件默认是ASCII编码,中文在显示时会做一个ASCII到系统默认编码的转换,这时就会出错:SyntaxError: Non-ASCII character。需要在代码文件的第一行或第二行添加编码指示:
指示源字符串的编码格式。
encode也
是任何字符串具有的方法,将字符串转换成参数指定的格式

3 系统的默认编码
对 于中文系统来说,默认的是gbk,gb2312也可以,因为它是gbk的字集。使用print输出时,字符串会被转换成此格式,隐式转换时,是从代码文件 编码格式转换成gbk,默认是ASCII->GBK。考虑上面第二点,如果字符串编码不是ASCII,则隐式转换会出错,需要显式转换,使用 encode方法。如果指定了代码文件格式为gbk,则隐式转换不存在问题。

1 # coding=gbk
2 print ' 中文 '


2 字符串的编码
像上面那样直接输入的字符串是按照代码文件的编码来处理的,如果是unicode编码,有以下三种方式:

1 s1 = u ' 中文 '
2 s2 = unicode( ' 中文 ' , ' gbk ' )
3 s3 = s1.decode( ' gbk ' )


unicode是一个内置函数,第二个参数指示源字符串的编码格式。
decode是任何字符串具有的方法,将字符串转换成unicode格式,参数

1 # coding=gbk
2
3 s = u ' 中文 '
4 print s.encode( ' gbk ' )


文件读写


只是ASCII或者gbk编码格式的的文件读写,比较简单,读写如下:

1 # coding=gbk
2
3 f = open( ' c:/intimate.txt ' , ' r ' ) # r 指示文件打开模式,即只读
4 s1 = f.read()
5 s2 = f.readline()
6 s3 = f.readlines() # 读出所有内容
7
8 f.close()
9
10 f = open( ' c:/intimate.txt ' , ' w ' ) # w 写文件
11 f.write(s1)
12 f.writelines(s2) # 没有writeline
13 f.close()


f.writelines不会输出换行符。
unicode文件读写:

1 # coding=gbk
2 import codecs
3
4 f = codecs.open( ' c:/intimate.txt ' , ' a ' , ' utf-8 ' )
5 f.write(u ' 中文 ' )
6 s = ' 中文 '
7 f.write(s.decode( ' gbk ' ))
8 f.close()
9
10 f = codecs.open( ' c:/intimate.txt ' , ' r ' , ' utf-8 ' )
11 s = f.readlines()
12 f.close()
13 for line in s:
14      print line.encode( ' gbk ' )

 

Python中文全攻略(转载)
2008年06月27日 星期五 09:57

1.        在Python中使用中文
在Python中有两种默认的字符串:str和unicode。在Python中一定要注意区分“Unicode字符串”和“unicode对象”的区别。后面所有的“unicode字符串”指的都是python里的“unicode对象”。
事实上在Python中并没有“Unicode字符串”这样的东西,只有“unicode”对象。一个传统意义上的unicode字符串完全可以用str对象表示。只是这时候它仅仅是一个字节流,除非解码为unicode对象,没有任何实际的意义。
我们用“哈哈”在多个平台上测试,其中“哈”对应的不同编码是:
1.              UNICODE (UTF8-16),      C854;
2.              UTF-8,                    E59388;
3.              GBK,               B9FE。
1.1     Windows控制台
下面是在windows控制台的运行结果:
可以看出在控制台,中文字符的编码是GBK而不是UTF-16。将字符串s(GBK编码)使用decode进行解码后,可以得到同等的unicode对象。
注意:可以在控制台打印ss并不代表它可以直接被序列化,比如:
向文件直接输出ss会抛出同样的异常。在处理unicode中文字符串的时候,必须首先对它调用encode函数,转换成其它编码输出。这一点对各个环境都一样。
总结:在Python中,“str”对 象就是一个字节数组,至于里面的内容是不是一个合法的字符串,以及这个字符串采用什么编码(gbk, utf-8, unicode)都不重要。这些内容需要用户自己记录和判断。这些的限制也同样适用于“unicode”对象。要记住“unicode”对象中的内容可绝 对不一定就是合法的unicode字符串,我们很快就会看到这种情况。
总结:在windows的控制台上,支持gbk编码的str对象和unicode编码的unicode对象。
1.2     Windows IDLE(在Shell上运行)
在windows下的IDLE中,运行效果和windows控制台不完全一致:
可以看出,对于不使用“u”作标识的字符串,IDLE把其中的中文字符进行GBK编码。但是对于使用“u”的unicode字符串,IDLE居然一样是用了GBK编码,不同的是,这时候每一个字符都是unicode(对象)字符!!此时len(ss) = 4。
这样产生了一个神奇的问题,现在的ss无法在IDLE中正常显示。而且我也没有办法把ss转换成正常的编码!比如采用下面的方法:
这有可能是因为IDLE本地化做得不够好,对中文的支持有问题。建议在IDLE的SHELL中,不要使用u“中文”这种方式,因为这样得到的并不是你想要的东西。
这同时说明IDLE的Shell支持两种格式的中文字符串:GBK编码的“str”对象,和UNICODE编码的unicode对象。
1.3     在IDLE上运行代码
在IDLE的SHELL上运行文件,得到的又是不同的结果。文件的内容是:
直接运行的结果是:
毫无瑕疵,相当令人满意。我没有试过其它编码的文件是否能正常运行,但想来应该是不错的。
同样的代码在windows的控制台试演过,也没有任何问题。
1.4     Windows Eclipse
在Eclipse中处理中文更加困难,因为在Eclipse中,编写代码和运行代码属于不同的窗口,而且他们可以有不同的默认编码。对于如下代码:
#!/usr/bin/python
# -*- coding: utf-8 -*-
s = "哈哈"
ss = u'哈哈'
print repr(s)
print repr(ss)
print s.decode('utf-8').encode('gbk')
print ss.encode('gbk')
print s.decode('utf-8')
print ss
前四个print运行正常,最后两个print都会抛出异常:
'/xe5/x93/x88/xe5/x93/x88'
u'/u54c8/u54c8'
哈哈
哈哈
Traceback (most recent call last):
File "E:/Workspace/Eclipse/TestPython/Test/test_encoding_2.py", line 13, in <module>
    print s.decode('utf-8')
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)
也就是说,GBK编码的str对象可以正常打印,但是不能打印UNICODE编码的unicode对象。在源文件上点击“Run as”“Run”,然后在弹出对话框中选择“Common”:
可以看出Eclipse控制台的缺省编码方式是GBK;所以不支持UNICODE也在情理之中。如果把文件中的coding修改成GBK,则可以直接打印GBK编码的str对象,比如s。
如果把源文件的编码设置成“UTF-8”,把控制台的编码也设置成“UTF-8”,按道理说打印的时候应该没有问题。但是实验表明,在打印UTF-8编码的str对象时,中文的最后一个字符会显示成乱码,无法正常阅读。不过我已经很满足了,至少人家没有抛异常不是:)
BTW: 使用的Eclipse版本是3.2.1。
1.5     从文件读取中文
在window下面用记事本编辑文件的时候,如果保存为UNICODE或UTF-8,分别会在文件的开头加上两个字节 “/xFF/xFE” 和三个字节“/xEF/xBB/xBF”。在读取的时候就可能会遇到问题,但是不同的环境对这几个多于字符的处理也不一样。
以windows下的控制台为例,用记事本保存三个不同版本的“哈哈”。

打开utf-8格式的文件并读取utf-8字符串后,解码变成unicode对象。但是会把附加的三个字符同样进行转换,变成一个unicode字符,字符的数据值为“/xFF/xFE”。这个字符不能被打印。编码的时候需要跳过这个字符。

打开unicode格式的文件后,得到的字符串正确。这时候适用utf-16解码,能得到正确的unicdoe对象,可以直接使用。多余的那个填充字符在进行转换时会被过滤掉。
打开ansi格式的文件后,没有填充字符,可以直接使用。
结论:读写使用python生成的文件没有任何问题,但是在处理由notepad生成的文本文件时,如果该文件可能是非ansi编码,需要考虑如何处理填充字符。
1.6     在数据库中使用中文
刚刚接触Python,我用的数据库是mysql。在执行插入、查找等操作时,如果运行环境使用的字符编码和mysql不一致,就可能导致运行时的错误。当然,和上面看到的情况一样,运行环境并不是关键因素,关键是查询语句的编码方式。如果在每次执行查询操作时都把查询字符串做一次编码转换,转变成mysql的默认字符编码,一样不会遇到问题。但是这样写代码也太痛苦了吧。
使用如下代码连接数据库:
self.conn = MySQLdb.connect(use_unicode = 1, charset='utf8', **server)
我不能理解的是既然数据库用的默认编码是UTF-8,我连接的时候也用的是UTF-8,为什么查询得到的文本内容却是UNICODE编码(unicode对象)?这是MySQLdb库的设置么?
1.7     在XML中使用中文
使用xml.dom.minidom和MySQLdb类似,对生成的dom对象调用toxml方法得到的是unicode对象。如果希望输出utf-8文本,有两种方法:
1.使用系统函数
在输出xml文档的时候进行编码,这是我觉得最好的方法。
xmldoc.toxml(encoding=’utf-8’)
xmldoc.writexml(outfile, encoding = ‘utf-8’)
2.自己编码生成
在使用toxml之后可以调用encode方法对文档进行编码。但这种方法无法得到合适的xml declaration(xml文档第一行中的encoding部分)。
不要尝试通过xmldoc.createProcessingInstruction来创建一个processing instraction:
<?xml version=’1.0’ encoding=’utf-8’?>
xml declaration虽然看起来像是,但是事实上并不是一个processing instraction。可以通下面的方法得到一个满意的xml文件:
print >> outfile, “<?xml version=’1.0’ encoding=’utf-8’?>”
print >> outfile, xmldoc.toxml().encode(‘utf-8’)[22:]
其中第二行需要过滤掉在调用xmldoc.toxml时生成的“<?xml version=’1.0’ ?>”,它的长度是22。
相面是两种方法的用法比较:
另外,在IDLE的shell中,不要用 u’中文’ 对属性进行赋值。上面讨论过,这样得到的unicode字符串不正确。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值