python中默认编码是ASCII,可以通过以下方式设置和获取:
import
sys
print sys.getdefaultencoding() sys.setdefaultencoding( ' gbk ' ) 但直到python重新启动后新的默认编码才会生效,我试了一下,setdefaultencoding总是会出错,没有这个属性。用dir看,确实没有,python版本是2.5,不知道是否被取消了。
1
#
coding=gbk
2 print ' 中文 '
1
s1
=
u
'
中文
'
2 s2 = unicode( ' 中文 ' , ' gbk ' ) 3 s3 = s1.decode( ' gbk ' )
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()
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 ' )
#---------------------------------------------------------------------------------------
以上为转发的内容,下面为我做的一些补充。
对于上文中
'setdefaultencoding总是会出错'这个问题,可以通过以下方式解决:
import
sys
reload(sys) print sys.getdefaultencoding() sys.setdefaultencoding( ' utf-8 ' )
通过上面的代码,应该就可以把系统的编码方式更改了.
在我们对一个不规范合法的编码字符串进行解码时会抛出异常:
>>>
s
=
"\x84\xe5\xb0\x8f\xe6\x98\x8e"
>>> s.decode( 'utf-8' )
Traceback (most recent call last):
File "<interactive input>", line 1, in ? File "E:\Program Files\Python24\lib\encodings\utf_8.py", line 16, in decode UnicodeDecodeError: 'utf8' codec can't decode byte 0x84 in position 0: unexpected code byte >>>
下面对s进行分析:
把s转换为二进制代码为:10000100 11100101 10110000 10001111 10110110 10011000 10001011
对这段二进制代码分析:第一个字节为10000100,而在utf-8编码规范规定0x80 到 0xBF 范围内的字节,只是跟随字节, 它们本身并不是字符,因此此处把它放到第一个字节处不不合法的。然后对第二个字节进行分析可看出它左边有三个连续的1,这意味着第二个字节和随后的两个字节,(即11100101 10110000 10001111 )共三个字节一起编码为一个字符。同理可分析出后面的三个字节编码为一个字符。
因此我们只要把第一个不合法的字节去掉,就可以正常解码了
>>>
s
=
'\xe5\xb0\x8f\xe6\x98\x8e
'
>>> print s.decode( ' utf-8 ' ) 小明 >>> 问题是如果我们不知道字符里的不合法字节的位置时该怎么进行解码并的出正常编码的那些字符的结果呢,我们可以使用如下两种方法:
>>>
s
=
'\x84\xe5\xb0\x8f\xe6\x98\x8e\x84
'
>>> s.decode( ' utf-8 ' ) Traceback (most recent call last): File "<interactive input>", line 1, in ? File "E:\Program Files\Python24\lib\encodings\utf_8.py", line 16, in decode UnicodeDecodeError: 'utf8' codec can't decode byte 0x84 in position 0: unexpected code byte >>> print s.decode( ' utf-8 ' , ' ignore ' ) 小明 >>> print s.decode( ' utf-8 ' , ' replace ' ) ?小明? >>> 由上面的代码我们可以看到调用decode函数时第二个参数为对于不合法(即错误)的字节处理的方式,默认情况下为'strict',即出现错误字节就抛出异常。而'ignore'方式,则会忽略字符串中不合法的字节,'replace'方式下会用固定的字节替换掉那些不合法的字节。 |