Chinaunix首页 | 论坛 | 博客
  • 博客访问: 29307248
  • 博文数量: 2065
  • 博客积分: 10377
  • 博客等级: 上将
  • 技术积分: 21525
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-04 17:50
文章分类

全部博文(2065)

文章存档

2012年(2)

2011年(19)

2010年(1160)

2009年(969)

2008年(153)

分类: Python/Ruby

2010-03-05 17:25:14

整理Python中的乱码

[整理人:hkebao#126.com 整理时间:2010-1-13]

故障情况一:Eclipse环境下面输出中文现乱码

#coding:utf-8

print "你好呀" 

输出: 乱码

而且我查看了一下编辑器的编码也是utf-8 那为什么会出现乱码呢?奇怪了~~~

解决办法:

我们还是用utf-8 的编码吧!

我这样写:

#-*- coding: utf-8 -*-

s = "哈哈"

print s                 打印报乱码

解决步骤如下:

#-*- coding: utf-8 -*-

s = "哈哈"

print repr(s)               #打印:'\xe5\x93\x88\xe5\x93\x88'

 

ss = u'哈哈'

print (ss)                  #打印 :哈哈      这样也可以打印中文字符的!

 

print repr(ss)              #打印:u'\u54c8\u54c8'

 

#-*- coding: utf-8 -*-

s = "哈哈"

print s.decode('utf-8').encode('gbk')   #这样可以将中文乱码解决掉

 

#-*- coding: utf-8 -*-

s = "哈哈"

print s.decode('utf-8')             #直接使用utf-8   打印中文

 

 

二、在python中使用中文

python中有两种默认的字符串:str Unicode .

总结:在pythonstr对象就是一个字节数组,至于里面的内容是不是一个合法的字符串,以及这个字符串采用什么编码(gbk,utf-8,unicode)都不重要。

 

三、在数据库中使用中文

 

 

 

 

 

 

四、在Django项目中报

'ascii' codec can't decode byte 0xe6 in position 15: ordinal not in range(128)

现在来跟踪一下这个BUG。看一下要如何解决

第一种情况:

try:

    return HttpResponse("")

except Exception,e:

     logging.debug(e)

这样的写就报这个错了。

初步我感觉问题应该是出在:JS写法上面导致的!

网上追踪:

一个很关键的并且要常记住的,就是代码中所有字符串都统一使用unicode,而不是str。这样,自己就能很清楚要处理的字符串类型了。请记住,是所有,任何地方。

>>s1 = u'%s欢迎你' % u'北京'

>>s1

输出: u'\u5317\u4eac\u6b22\u8fce\u4f60'      得到的是unicode编码形式

>>print s1                                  返回的就是  欢迎你北京

 

>>s1 = '%s欢迎你' % '北京'

>>s1

输出: '\xb1\xb1\xbe\xa9\xbb\xb6\xd3\xad\xc4\xe3' 返回字符串编码

>>print s1                                  返回的就是  欢迎你北京

 

但是如果这样写:

>>s1 = u'%s欢迎你' % '北京'

则报:UnicodeDecodeError: 'ascii' codec can't decode byte 0xb1 in position 0: or

not in range(128)

同样的如果这样写:

>>s1 = '%s欢迎你' % u'北京'

一样的会报这样的错误!

总结:如果想使用%s 的格式化输出的方式的话就必须要注意其前后两者的编码方式保持一致。

要不然就会报这种错误!

 

UnicodeDecodeError可猜想得到,解析器尝试使用ascii'%s欢迎您!'进行解码,由于'%s欢迎您!'实际是使用utf-8编码的(这是我系统终端默认的),所以使用ascii解码肯定会错

 

'%s欢迎你'  解析器会尝试使用ascii对其做解码处理。由于默认我们为utf-8所以出错

PS 引自一段对话摘要如下:

str转成unicode不是直接构造,是用str对象的decode方法。

str的编码是与系统环境相关的,一般就是sys.getfilesystemencoding()得到的值

unicode你可以不管它是怎么存的,就把它看做是系统能够识别其中内容的文本类型

所以从unicodestr,被看做是把一个信息文本编码为二进制字节流的过程,要用encode方法

strunicode,看作是从二进制串出解读出有意义的信息文本,所以要用decode

其中的str 可以看成是一个对象处理!

现在我将代码写成如下:

return

HttpResponse("

" % app_id.decode('utf-8'))

 

还是继续报。想起来之前遇到的BT问题。我有点无语了!


2010-3-7 继续跟踪

解决办法:return HttpResponseRedirect("/serverinfolist/levels/?t_id="+app_id)

这样就可以解决了。昏~




2010-07-24号

我发现了我如果使用utf-8保存的汉字如 你好 大小为6字节占用空间4KB. 而如果我是使用ANSI保存的话则大小为4字节 占用4KB空间。环境是WINDOWS




 

 

阅读(1031) | 评论(1) | 转发(1) |
给主人留下些什么吧!~~