Python编码小记

  当用Python读取文件时,文件的编码方式与读取文件的方式似乎很有意思.

  一小段Python代码如下:

  

#coding:utf-8
  if __name__ == '__main__':
    str=open('content.txt','r').readline()
    #str.decode('gbk').encode('utf-8')注意这行隐掉了
    str.decode('utf-8').encode('gbk')
    print str

 

content.txt内容如下:

  啦啦啦啦,德玛西亚!!!1245abcd

运行会报错:

Traceback (most recent call last):
File "C:\Python27\551059.py", line 5, in <module>
str.decode('utf-8').encode('gbk')
File "C:\Python27\lib\encodings\utf_8.py", line 16, in decode
return codecs.utf_8_decode(input, errors, True)
UnicodeDecodeError: 'utf8' codec can't decode byte 0xc0 in position 0: invalid s
tart byte
>>>

 

现在去掉# 并隐掉下一行,如下:

#coding:utf-8
  if __name__ == '__main__':
    str=open('content.txt','r').readline()
    str.decode('gbk').encode('utf-8')注意这行隐掉了
    #str.decode('utf-8').encode('gbk')
    print str

 

运行结果:

啦啦啦啦,德玛西亚!!!1245abcd
>>>

现在好好来分析一下,encode和decode吧!网上大婶们的解释如下:

字符串在Python内部的表示是unicode编码,因此,在做编码转换时,通常需要以unicode作为中间编码,即先将其他编码的字符串解码(decode)成unicode,再从unicode编码(encode)成另一种编码。

decode的作用是将其他编码的字符串转换成unicode编码,如str1.decode('gb2312'),表示将gb2312编码的字符串str1转换成unicode编码。

encode的作用是将unicode编码转换成其他编码的字符串,如str2.encode('gb2312'),表示将unicode编码的字符串str2转换成gb2312编码。

因此,转码的时候一定要先搞明白,字符串str是什么编码,然后decode成unicode,然后再encode成其他编码

 

查看记事本的编码格式:默认为ANSI,补充一下:不同的国家和地区制定了不同的标准,由此产生了 GB2312, BIG5, JIS 等各自的编码标准。这些使用 2 个字节来代表一个字符的各种汉字延伸编码方式,称为 ANSI 编码。在简体中文系统下,ANSI 编码就代表 GB2312 编码!于是乎,我们对txt文件应先将gbk转换为Unicode,使Python可以识别txt中的内容,然后再将Unicode转换为utf-8就可以正确显示了.

  当然若是保存txt文件时选择以utf-8编码方式保存(UTF-8(8-bit Unicode Transformation Format)是一种针对Unicode的可变长度字符编码,又称万国码。),那么第二段代码就会报错了!

posted @ 2014-08-11 10:56  竹花小米  阅读(995)  评论(0编辑  收藏  举报