这个问题曾在我初学Python的时候令我头疼不已,尤其是目前我们因为各种包的原因还只能使用2.x的版本。在3.x中字符编码已经统一用Unicode了。
Python 默认支持的是ASCII字符,包含了英文字母大小写以及标点符号,用一枚字节表示。中文则使用两枚字节表示。
没兴趣的同学可以绕过这段…
有人可能要问了,我擦,为神马以前说一个汉字的精度越高字节越多么?为神马是两枚字节?
这是两个不同的概念。存储里讲的是一个汉字占两个字节。 而你说的点阵那个是打印码。
平时说1个汉字占2个字节,是指汉字编码,就象每个字符都有一个ASCII码一样。1个ASCII码占1个字节,而1个汉字编码占2个字节。
简单地解释下,我们屏幕上看到的汉字其实是一个16*16的矩阵,它所需要的位数共是16*16=256个位,每个字节为8位,因此,每个汉字都需要用256/8=32个字节来表示。
即每两个字节代表一行的16个点,共需要16行,显示汉字时,只需一次性读取32个字节,并将每两个字节为一行打印出来,即可形成一个汉字。
这也就是传说中的点阵字体。
—我是正文的分割线—
So当中文编码和ASCII混用的话,就会出现错误咯。
目前中文编码有GB2312,BIG5,GBK。
建议使用统一字符集Unicode,可以处理所有的语言文字。
如果在.py文件中使用中文,请使用:
#-*- coding:utf-8 –*-
请注意在使用IDE的时候,project的编码格式一定要设置为utf-8,否则输出的仍是乱码,因为你写的脚本没用UTF-8保存。
先别急着去练习,咱们来看看下面这个脚本:
#-*- coding:utf-8 –*-
# chinese.py
chinese=”’
在Python中使用中文,一定要
注意字符编码问题
”’
print chinese
在命令行运行的结果:
这是咋回事呢?不是写了编码了么?还乱码啊,有木有?有木有?有木有?
这是因为win的,命令行用的是cp936编码,而上面脚本用的是utf-8编码,因此导致乱码。
解决方法是,使用decode和encode函数对字符重新解码和编码。
print chinese.decode(‘utf-8’).encode(‘cp936’)
OK,熟悉的文字出来了。
2011/8/8更新,以下内容转载自:
http://ppjava.iteye.com/blog/210143
常见的编码转换分为以下几种情况:
unicode->其它编码
例如:a为unicode编码 要转为gb2312。a.encode(‘gb2312’)
其它编码->unicode
例如:a为gb2312编码,要转为unicode. unicode(a, ‘gb2312’)或a.decode(‘gb2312’)
编码1 -> 编码2
可以先转为unicode再转为编码2
如gb2312转big5
unicode(a, ‘gb2312’).encode(‘big5’)
判断字符串的编码
isinstance(s, str) 用来判断是否为一般字符串
isinstance(s, unicode) 用来判断是否为unicode
如果一个字符串已经是unicode了,再执行unicode转换有时会出错(并不都出错)
可以写一个通用的转成unicode函数:
def u(s, encoding):
if isinstance(s, unicode):
return s
else:
return unicode(s, encoding)