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) 编辑 收藏 举报