详解Python字符串编码格式
最早的字符串编码是美国标准信息交换码ASCII,仅对10个数字、26个大写英文字母、26个小写英文字母及一些其他符号进行了编码。ASCII采用1个字节来对字符进行编码,最多只能表示256个符号。
随着信息技术的发展和信息交换的需要,各国的文字都需要进行编码,不同的应用领域和场合对字符串编码的要求也略有不同,于是又分别设计了多种不同的编码格式,常见的主要有UTF-8、UTF-16、UTF-32、GB2312、GBK、CP936、base64、CP437等等。UTF-8编码是国际通用的编码,以1个字节表示英语字符(兼容ASCII),以3个字节表示中文,还有些语言的符号使用2个字节(例如俄语和希腊语符号)或4个字节,UTF-8对全世界所有国家需要用到的字符进行了编码。
GB2312是我国制定的中文编码,使用1个字节表示英语,2个字节表示中文;GBK是GB2312的扩充,而CP936是微软在GBK基础上开发的编码方式。GB2312、GBK和CP936都是使用2个字节表示中文。
不同编码格式之间相差很大,采用不同的编码格式意味着不同的表示和存储形式,把同一字符存入文件时,写入的内容可能会不同,在理解其内容时必须了解编码规则并进行正确的解码。如果解码方法不正确就无法还原信息,从这个角度来讲,字符串编码也具有加密的效果。
在本文的讨论中,包括本公众号里的绝大多数文章,都是基于Python 3.5.x的,整个Python社区都知道最迟到2020年Python就不再提供维护了,这个时间很可能会提前,要是还有人坚持抱着Python 2.7不放,可能很快就要吃亏的。
在Python 3.x中,字符串有关的类主要是str和bytes,其中bytes是字节串类型。str对象使用encode()方法可以按指定的编码格式编码成为字节串,而bytes对象使用decode()方法并指定正确的编码格式进行解码即可还原为原来的str对象。
>>> '山东烟台'.encode() #默认使用utf8编码
b'\xe5\xb1\xb1\xe4\xb8\x9c\xe7\x83\x9f\xe5\x8f\xb0'
>>> _.decode() #默认使用utf8解码
'山东烟台'
>>> '山东烟台'.encode()
b'\xe5\xb1\xb1\xe4\xb8\x9c\xe7\x83\x9f\xe5\x8f\xb0'
>>> _.decode('gbk') #使用utf8编码再使用gbk解码的结果
'灞变笢鐑熷彴'
Python 3.x完全支持中文字符,默认使用UTF8编码格式,无论是一个数字、英文字母,还是一个汉字,都按一个字符对待和处理。例如在Python 3.5.2中执行下面的代码,从代码中可以看到,在Python 3.x中甚至可以使用中文作为变量名。
>>> import sys
>>> sys.getdefaultencoding() #查看默认编码格式
'utf-8'
>>> s = '中国山东烟台'
>>> len(s) #字符串长度,或者包含的字符个数
6
>>> s = 'SDIBT'
>>> len(s)
5
>>> s = '中国山东烟台abcde' #中文与英文字符同样对待,都算一个字符
>>> len(s)
11
>>> 姓名 = '董付国' #使用中文作为变量名
>>> 年龄 = 39
>>> print(姓名) #输出变量的值
董付国
>>> print(年龄)
39
这样的就引出了一个问题,文本文件中存放的是字符串信息,自然也有不同的编码格式,这样的话就需要在读写内容时使用正确的编码格式,使用gbk编码的文件无法通过utf8编码正常读写,除非里面全都是ASCII编码范围的字符。Python 3.x中用来打开文件的内置函数open()还提供了一个encoding参数用来指定文件的编码格式,默认使用cp936编码,例如:
>>> fp = open('test1.txt', 'r') #默认使用cp936
>>> fp
<_io.TextIOWrapper name='test1.txt' mode='r' encoding='cp936'>
>>> fp = open('test1.txt', 'r', encoding='utf8') #明确指定使用utf8
>>> fp
<_io.TextIOWrapper name='test1.txt' mode='r' encoding='utf8'>
至于如何读写文本文件内容,请参考我昨天发的文章使用Python读写文本文件内容。
最后一个问题来了,如果是自己生成的文本文件,当然是知道用的什么编码了,如果是别人生成的呢,有没有办法先判断一下使用的是什么编码然后再进行读写呢?强大的Python有个扩展库chardet就是专门用来做这个的。
>>> import chardet
>>> with open('test1.txt', 'rb') as fp:
result = chardet.detect(fp.read())
>>> result #结果的第一项是可信度,有时候可能不是特别准确
{'confidence': 1.0, 'encoding': 'ascii'}
>>> with open('111.txt', 'rb') as fp:
result = chardet.detect(fp.read())
>>> result
{'confidence': 0.73, 'encoding': 'windows-1252'}
>>> with open('222.txt', 'rb') as fp:
result = chardet.detect(fp.read())
>>> result['encoding']
'UTF-8-SIG'
详解Python字符串编码格式相关推荐
- python比较两个字符串相似度_详解Python 字符串相似性的几种度量方法
字符串的相似性比较应用场合很多,像拼写纠错.文本去重.上下文相似性等. 评价字符串相似度最常见的办法就是:把一个字符串通过插入.删除或替换这样的编辑操作,变成另外一个字符串,所需要的最少编辑次数,这种 ...
- [转载] python字符串_一文详解Python字符串条件判断方法
参考链接: Python字符串| isdecimal 作者 | 张小吉 来源 | 鸡仔说(ID:jizaishuo) 前言 人喜欢为自己的错误,找各种借口开脱.本周做算法题leetcode<39 ...
- python字符串转date_详解python 字符串和日期之间转换 StringAndDate
python 字符串和日期之间转换 StringAndDate 这里给出实现代码,直接可以使用.大家可以看下. 实例代码: ''''' Created on 2013-7-25 @author: Ad ...
- 详解python 字符串
python中另一个常用的数据类型是字符串,使用单引号或双引号,同样属于不可变数据类型 var1 = 'hello1' var2 = "hello2" 字符串支持分段截取,例如: ...
- python字符串切片用法_详解Python字符串切片
在python中,我们定义好一个字符串,如下所示. 在python中定义个字符串然后把它赋值给一个变量. 我们可以通过下标访问单个的字符,跟所有的语言一样,下标从0开始(==,我自己都觉得写的好脑残了 ...
- python字符串相似度去重_详解Python 字符串相似性的几种度量方法
字符串的相似性比较应用场合很多,像拼写纠错.文本去重.上下文相似性等. 评价字符串相似度最常见的办法就是:把一个字符串通过插入.删除或替换这样的编辑操作,变成另外一个字符串,所需要的最少编辑次数,这种 ...
- python判断字符串合法,详解Python判定IP地址合法性的三种方法 python中判断一个字符串是否是IP地址...
html 中 鼠标放在标签上会显示小手状,其它标签在其他标签上,美工给加了一些样式,鼠标放上去也显示小手状.有哪位大手状样式 有什么不懂的前端问题可以去菜鸟驿站.全都是泡沫,只一刹的花火,所谓的友情, ...
- python调用ping命令并输出ttl_详解Python调用系统命令的六种方法
作为胶水语言,Python可以很方便的执行系统命令,Python3中常用的执行操作系统命令有os.system().os.popen().subprocess.popen().subprocess.c ...
- python import io_详解Python IO编程
文件读写 读文件 try: # windows下utf8 f = open('./README.md', 'r', encoding='utf8', errors='ignore') print(f. ...
最新文章
- EntLib 3.1学习笔记(6) : Security Application Block
- Linux/Unix shell 监控Oracle告警日志(monitor alter log file)
- Vue中父组件调用子组件的方法
- SAP UI5库对浏览器类型检测的实现
- redis decr 防止超卖_一文搞定Redis高级特性与性能调优
- leetcode链表--1、深拷贝链表
- 分子动力学模拟AMBER参数意义
- 数电educoder的verilog参考答案
- 需求分析-4 用例分析
- c语言恶搞小程序自动关机,C语言的自动关机程序及捉弄人的小程序.doc
- 小程序管理新闻资讯分类-微信小程序视频教程27
- 关于Word样式自动更新的详解
- 2020-02-29
- Image segmentation of nasopharyngeal carcinoma using 3D CNN with long-range skip connection and mult
- 如何解决windows10 默认浏览器为不是Microsoft Edge(或者想改动)时出现闪退,且改动失败
- java获取当前时间和求时间差(分钟,秒钟,小时,年等)
- Qemu连接外网的配置方法
- 基于单片机的篮球计分器系统设计(#0455)
- 拓展编辑器(八)_重写菜单
- 第一章 人机交互概述
热门文章
- 测试linux系统的程序员,日常测试Linux命令
- python 千位分隔符_玩转千位分隔符输出 - leejun2005的个人页面 - OSCHINA - 中文开源技术交流社区...
- excel 切片器 html,excel切片器怎么使用2010
- proxmox换源_关于Proxmox 5.x的国内有效镜像源
- 生成新的dataframe_Python之Pandas使用系列(九):DataFrame中列操作的技巧
- html介绍班级,班级介绍词 展示班级风采
- 计算机音乐夜里,电脑自动播放音乐提醒你起床,晚上自动关机!
- 开氏温度与摄氏度换算_【油品小知识】你不知道的“柴油密度”与“温度”的故事...
- 如何通过三视图判断立方体个数_装机小白看过来:如何通过显卡参数来判断高端低端?...
- java 用properties文件配置spring数据源,用spring的JdbcTemplate的queryForList查数据