码迷,mamicode.com
首页 > 编程语言 > 详细

python 之 字符集总结

时间:2015-07-13 22:13:25      阅读:118      评论:0      收藏:0      [点我收藏+]

标签:

被字符集蹂躏了很长时间,对编码方式和字符集的概念和理解还是处于上学时候学得那一点半调子,今天有点时间就好好学习下。

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个多小时~~~~~

明日再整理吧

 

python 之 字符集总结

标签:

原文地址:http://www.cnblogs.com/feitian2012/p/4643986.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!