python 之 字符集总结

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

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

明日再整理吧

时间: 2024-10-29 19:09:16

python 之 字符集总结的相关文章

Python任意字符集转换

在python处理文本的过程中,经常会有文本字符集转换的情况, 而我们希望用一个方法,不用关心文本原本的字符集是什么样的,直接转换成想要的任何字符集就可以了. 方法一: import chardet def convert_encoding(data,new_coding='UTF-8'): # 任意字符集转换 encoding = chardet.detect(data)['encoding'] if new_coding.upper() != encoding.upper(): data =

python与字符集编码

讲的比较明白的博客:http://www.cnblogs.com/huxi/archive/2010/12/05/1897271.html 以上面博文的汉为例子,汉字的GBK编码是baba, UNICODE码字是6C49 UTF16-LE编码是496C,UTF-8编码是e6b189 python文件的编码制定为GBK line="汉" input=line.decode('gbk','ignore').encode("UTF-8"); rint repr(input

Python学习----字符集编码

1 ASCII码: American Standard Code for information inerchange 美国最初采用的二进制和字符的编码映射表 2 Gb2312, Gbk1.0, Gbk10830 中国最开始制定的编码表Gb2312,只包含简体字,后发现繁体字没有加进去,不断扩充,而出现了Gbk系列编码 3 unicode, utf-8 由于世界各国都制定本国的编码表,导致各国之间信息交流出现障碍,遂ISO组织出面制定全球统一的编码表,即unicode码,又称万国码. 万国码虽然

Python基础学习(四)

Python 集合: set 顾明思义,就是个集合,集合的元素是唯一的,无序的.一个{ }里面放一些元素就构成了一个集合,set里面可以是多种数据类型(但不能是列表,集合,字典,可以是元组) 它可以对列表里面的重复元素进行去重 list1 = [1,2,3,23,1,4,2] list1 = set(list1) 集合的关系测试: a = {1,2,3,4,5} b = {1,3,5,7,9} a.symmetric_difference(b) #对称差集 a.difference(b) #差集

python开发中对正则表达式及re模块的学习

正则表达式是个很牛逼的东西,不管是在javascript,还是在Python web开发(http://www.maiziedu.com/course/python-px/)中,我们都会遇到正则表达式,虽然javascript和Python的正则表达式区别不大,但是正则表达式是Python中必不可少的一部分,所以今天就跟大家一起讨论一下python中的re模块. re模块包含对正则表达式的支持. 什么是正则:  正则表达式是可以匹配文本片段的模式.  正则表达式'Python'可以匹配'pyth

初识python之 APP store排行榜 蜘蛛抓取(一)

直接上干货!! 采用python 2.7.5-windows 打开 http://www.apple.com/cn/itunes/charts/free-apps/  如上图可以见采用的是utf-8 编码 经过一番思想斗争  编码如下 (拍砖别打脸) #coding=utf-8 import urllib2 import urllib import re import thread import time #----------- APP store 排行榜 ----------- class

《Python基础教程(第二版)》学习笔记 -&gt; 第十章 充电时刻 之 标准库

SYS sys这个模块让你能够访问与Python解释器联系紧密的变量和函数,下面是一些sys模块中重要的函数和变量: 函数和变量 描述 argv 命令行参数,包括脚本和名称 exit([arg])                退出当前的程序,可选参数为给定的返回值或者错误信息 modules 映射模块名字到载入模块的字典 path 查找模块所在目录的目录名列表 platform 平台标识符 stdin 标准输入流-- 一个类文件对象 stdout 标准输出流-- 一个类文件对象 stderr

字符编码【转载】

转载:http://www.techug.com/character-encoding 字符集和字符编码 编程技术2015-3-26TECHUG2条评论 本文将简述字符集,字符编码的概念.以及在遭遇乱码时的一些常用诊断技巧. 背景:字符集和编码无疑是IT菜鸟甚至是各种大神的头痛问题.当遇到纷繁复杂的字符集,各种火星文和乱码时,问题的定位往往变得非常困难.本文就将会从原理方面对字符集和编码做个简单的科普介绍,同时也会介绍一些通用的乱码故障定位的方法以方便读者以后能够更从容的定位相关问题.在正式介绍

十分钟搞清字符集和字符编码

本文将简述字符集,字符编码的概念.以及在遭遇乱码时的一些常用诊断技巧. 背景:字符集和编码无疑是IT菜鸟甚至是各种大神的头痛问题.当遇到纷繁复杂的字符集,各种火星文和乱码时,问题的定位往往变得非常困难.本文就将会从原理方面对字符集和编码做个简单的科普介绍,同时也会介绍一些通用的乱码故障定位的方法以方便读者以后能够更从容的定位相关问题.在正式介绍之前,先做个小申明:如果你希望非常精确的理解各个名词的解释,那么可以查阅wikipedia.本文是博主通过自己理解消化后并转化成易懂浅显的表述后的介绍.