被字符集蹂躏了很长时间,对编码方式和字符集的概念和理解还是处于上学时候学得那一点半调子,今天有点时间就好好学习下。
1. 默认编码方式
第一个问题就是默认字符集,被搞到吐,有没有。
在ipython客户端的输入以及结果
In [6]: unicode_str=u‘中国‘ In [7]: unicode_str Out[7]: u‘\u4e2d\u56fd‘ In [8]: default_str = ‘中国‘ In [9]: default_str Out[9]: ‘\xe4\xb8\xad\xe5\x9b\xbd‘ In [10]: unicode_str.encode(‘utf-8‘) Out[10]: ‘\xe4\xb8\xad\xe5\x9b\xbd‘
为什么默认的是 utf-8的?因为我的系统默认的是LANG=zh_CN.utf-8??<待确认>
在py文件中输入
#!/usr/bin/env python2 if __name__ == "__main__": unicode_str = u‘中国‘ default_str = ‘中国‘
报错:SyntaxError: Non-ASCII character ‘\xe4‘ in file ***.py on line 4, but no encoding declared;
这个问题是因为“在python2的py里写中文,需要添加一行声明文件编码的注释,否则会默认是用ASCII”。这个无需多言
u‘\u4e2d\u56fd‘ ‘\xe4\xb8\xad\xe5\x9b\xbd‘
那么加上字符集,代码如下:
1 #!/usr/bin/env python2 2 # -*- coding:utf-8 -*- 3 if __name__ == "__main__": 4 unicode_str = u‘中国‘ 5 default_str = ‘中国‘ 6 print ‘%r‘ % unicode_str 7 print ‘%r‘ % default_str
不在报错,结果正常显示:
u‘\u4e2d\u56fd‘
‘\xe4\xb8\xad\xe5\x9b\xbd‘
代码第六行输出unicode字符集编码结果, 第七行输出utf-8字符集的编码。因为你默认选定了utf-8作为python程序中的默认编码方式,如果换成gbk,则完全不同的编码方式
1 #!/usr/bin/env python2 2 # -*- coding:gbk -*- 3 if __name__ == "__main__": 4 unicode_str = u‘中国‘ 5 default_str = ‘中国‘ 6 print ‘%r‘ % unicode_str.encode(‘gbk‘) 7 print ‘%r‘ % unicode_str 8 print ‘%r‘ % default_str
结果显示为:
‘\xd6\xd0\xb9\xfa‘
u‘\u4e2d\u56fd‘
‘\xd6\xd0\xb9\xfa‘
很明显,默认的中文字符集就换成了gbk
============================基础知识的分割线==========================
引申下,如果我是从数据库,文件或者其他地方读取或者写入文档又将如何?
case1:
写一行中文至文件中,查看文件的编码方式:
1 #!/usr/bin/env python2 2 # -*- coding:gbk -*- 3 from os.path import expanduser 4 if __name__ == "__main__": 5 default_str = ‘中国‘ 6 with open(expanduser(‘~/test.txt‘), ‘w‘) as f: 7 f.write(‘%s\n‘%default_str)
用指令"file -i test.txt‘ 查看文件的编码方式:《为什么是ISO的格式??明天补充》
test.txt: text/plain; charset=iso-8859-1
case2:
将字符集改回为utf-8,查看文件编码方式:
1 #!/usr/bin/env python2 2 # -*- coding:utf-8 -*- 3 from os.path import expanduser 4 if __name__ == "__main__": 5 default_str = ‘中国‘ 6 with open(expanduser(‘~/test.txt‘), ‘w‘) as f: 7 f.write(‘%s\n‘%default_str)
利用‘file -i test.txt‘查看文件:
test.txt: text/plain; charset=utf-8
case3:
读取一个文件编码方式与python指定方式不一样的文件 (test.txt文件为utf-8编码方式, python指定的方式为gbk):
1 #!/usr/bin/env python2 2 # -*- coding:gbk -*- 3 from os.path import expanduser 4 if __name__ == "__main__": 5 default_str = ‘中国‘ 6 with open(expanduser(‘~/test.txt‘), ‘r‘) as f: 7 lines = f.readlines() 8 for line in lines: 9 print ‘%r‘ %line 10 print line
显示结果为:
‘\xe4\xb8\xad\xe5\x9b\xbd\n‘
中国
更换,python指定方式为:utf-8,test.txt的方式为:gbk
1 #!/usr/bin/env python2 2 # -*- coding:gbk -*- 3 from os.path import expanduser 4 if __name__ == "__main__": 5 default_str = ‘中国‘ 6 with open(expanduser(‘~/test.txt‘), ‘w‘) as f: 7 f.write(‘%s\n‘%default_str)
显示的结果为:
‘\xd6\xd0\xb9\xfa\n‘
?й?
事实两点:
1. 写入和读出时,python和操作系统完整地保留了原有的编码和解码风格,没有做任何的转换
2. 在做print时,是系统的解释。《这个明天再研究》
本来想做个字符集的总结,却发现连一个默认字符集的问题,都搞了1个多小时~~~~~
明日再整理吧