python字符编码的一些理解

#!/usr/bin/env python
#coding:utf-8
str = '中国'
print type(str)
print str

str = u'中国'
print type(str)
print str

str = '中国'.decode('UTF8')
print type(str)
print str

  

输出:
<type 'str'> 涓浗 <type 'unicode'> 中国 <type 'unicode'> 中国

  

  1、设置了默认编码是UTF8,#coding:utf-8,之后定义的字符串都会是utf8的格式进行编码;

      2、所以讲第二行代码去掉的时候,就会报错

      File "D:/Program Files/Python/TS/encoding.py", line 3
SyntaxError: Non-ASCII character '\xe4' in file D:/Program Files/Python/TS/encoding.py on line 3, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details

      3、若将第二行代码改为#coding:gbk的话,‘中国’.decode('UTF8')就会报错,因为默认的编码是gbk了,所以中文字符解码的时候就应该是从gbk进行解码

  4、ps:在python自带的idle中第一个输出也不会是乱码

下面简单介绍一些解码和编码:

#!/usr/bin/env python
#coding:utf-8

str = '中国'.decode('UTF8')
print type(str)
print str

  unicode我的理解就是一个过渡的编码形式,decode也就是解码,都会解码成unicode形式,再经过编码转化成其他形式,所以转码前一直要知道str的编码格式。如下所示:

#!/usr/bin/env python
#coding:utf8

str = '中国'.decode('utf8')
print type(str)
print str

print type(str.encode('gbk'))
print str

  

<type 'unicode'>
中国
<type 'str'>
中国

  encoding参数取值表:

          值                                      描述
        
   'ascii'                                      7位Ascii码
   'latin-1'或'iso-8859-1'             ISO 8859-1 Latin-1
   'cp1252'                                 Windows 1252编码
   'utf-8'                                     8位变长编码
   'utf-16'                                   16位变长编码
   'utf-16-le'                               UTF-16, 小尾编码
   'utf-16-be'                              UTF-16, 大尾编码
   'unicode-escape'                   与unicode字面量u"string"相同的格式
   'raw-unicode-escape'            与unicode字面量ur"string"相同的格式

  eg:

s = u'\xe5\x8e\xa6\xe9\x97\xa8' 
print s.encode('raw_unicode_escape') 

  

  文件的读写

 首先,我们来了解一下中文的编码。

  1、GB2312-80字符集,中文名国家标准字符集(GB=GuóBiāo国标)。收入汉字6763个,符号715个,总计7478个字符,这是大陆普遍使用的简体字字符集。

  2、Big-5字符集(好像用的挺少吧),中文名大五码,是台湾繁体字的字符集,收入13060个繁体汉字,808个符号,总计13868个字符,普遍使用于台湾、香港等地区。

  3、GBK字符集,中文名国家标准扩展字符集(GB=GuóBiāo国标;K=Kuò扩,即扩展),兼容GB2312-80标准,包含Big-5的繁体字,但是不兼容Big-5字符集编码,收入21003个汉字,882个符号,共计21885个字符,包括了中日韩(CJK)统一汉字20902个、扩展A集(CJK Ext-A) 中的汉字52个。

  4、GB18030-2000字符集,包含GBK字符集和CJK Ext-A 全部6582个汉字,共计27533个汉字

  好像一般用到gb2312和gbk的比较多,GB18030只有遇到一些生僻的字的时候才会用的到。

  windows下的记事本默认的编码是ANSI:

  在简体中文Windows操作系统中,ANSI 编码代表 GBK 编码;在繁体中文Windows操作系统中,ANSI编码代表Big5;在日文Windows操作系统中,ANSI 编码代表 Shift_JIS 编码。

  

  言归正传,建立一个test.txt文件,内容abc中文。

#!/usr/bin/env python
#coding:utf8
file_obj = open('test.txt')
line = file_obj.readline()
print line.decode('utf8')
print type(line)

  这样是会有错误的因为txt默认编码是gbk的,所以在对line进行解码的时候用utf8是不行的,换成gbk就没问题了。

  

 

   今天又遇到了一个UCS2的问题。首先还是先来了解下UCS2是什么东西吧

   Unicode的学名是"Universal Multiple-Octet Coded Character Set",简称为UCS。UCS可以看作是"Unicode Character Set"的缩写。

   UCS有两种格式:UCS-2和UCS-4。顾名思义,UCS-2就是用两个字节编码,UCS-4就是用4个字节(实际上只用了31位,最高位必须为0)编码。下面让我们做一些简单的数学游戏:

  UCS-2有2^16=65536个码位,UCS-4有2^31=2147483648个码位。

  UCS-4根据最高位为0的最高字节分成2^7=128个group。每个group再根据次高字节分为256个plane。每个plane根据第3个字节分为256行 (rows),每行包含256个cells。当然同一行的cells只是最后一个字节不同,其余都相同。

  可以认为UTF-16和UCS-2基本相同。但UCS-2只是一个编码方案,UTF-16却要用于实际的传输,所以就不得不考虑字节序的问题。

   参考:http://blog.csdn.net/fmddlmyy/article/details/372148

  eg:文件是UCS-2 little endian编码格式

file_obj = open('test.txt')
line = file_obj.readline()
print line.decode('utf16')
print type(line)

输出:
abc中国
<type 'str'>

  

 

 

 

 

 

  注:

  1、python中的print直接把字符串传递给操作系统,所以你需要把str解码成与操作系统一致的格式。

  2、Unicode只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储。

   

 

posted on 2015-09-28 23:28  ferraborghini  阅读(295)  评论(0编辑  收藏  举报

导航