[转载] python中字符串编码形式及其所占字节
参考链接: Python中的字节对象与字符串
1.常见字符串编码错误
在使用Python读文件时经常遇到编码问题引起的错误,比如:
UnicodeDecodeError: 'gbk' codec can't decode byte 0x80 in position 30: illegal multibyte sequence
遇到这种异常时可以通过读文件时规定编码方式来解决,如下:
with open('zhengfu.txt','r',encoding='UTF-8') as read_zhengfu:
如果文件中还包含其他非UTF-8编码的字符,或者无关的特殊字符,可以再加入一个参数,如下:
with open('zhengfu.txt','r',encoding='UTF-8',errors='ignore') as read_zhengfu:
有时读文件时还会遇到一种问题就是第一行数据的开头多了一串‘'\ufeff’字符。比如:
如果用print(list[0])是看不到这个字符的。对这个没有研究过, 如果要去掉这串字符的话,可以使用‘utf-8-sig’这种编码方式:
with open('user_dict_2.txt','r',encoding='utf-8-sig') as read_dict:
但是我在写入文件时设置为‘utf-8-sig’格式时不起作用,写入的文件中还是有这个字符。
另外,在对字符串进行匹配的时候,'\ufeff’会影响字符串的匹配结果。
2.字符串编码
关于计算机内部如何表示字符串,为何又要创造这么多种编码方式,推荐阅读 https://www.cnblogs.com/hhwu/p/9529942.html 这篇博客里作者讲的很明白,这里主要是想汇总介绍Python中的字符串函数。
2.1 chr()函数和ord()函数
chr()函数是将一个整数返回一个对应的字符,ord()函数则相反,其返回一个字符的数值表示(返回的是Unicode值的十进制表示)。在Python3.6的版本中,chr()中整数的范围不再是0到255,扩大到了1114111,大于改值时,报ValueError错误。而ord()函数中只能接受单字符串作为其输入,否则会报TypeError错误。
print(chr(65)) #输出'A'
print(ord('A')) #输出65
2.2 Unicode编码
虽然Python 3的内存中Unicode来保存字符串,但为了节省内存,Python3内部使用3种方式存储Unicode字符。具体分为以下三种:
Latin-1一个字符占一个字节。比如ASCII码值UCS-2一个字符占两个字节。常见的中文都占用2个字节UCS-4一个字符占四个字节。比较偏僻的中文还有emoj表情通常占用4个字节。
python中提供了内置函数来查看每个字符串对象的编码类型。如果一个字符串的所有字符都能用ASCII码来表示,那么该字符串使用Latin-1。如果字符串中出现了中文,则采用UCS-2编码即可。如果字符串中有一些生僻字或者emoj表情的话,则必须使用UCS-4编码。注意在Python中,一个字符串中的所有字符只能采用一种编码方式,不能混用。因为一旦混用,那么字符串中每个字符所占的字节数必定不同,那么字符串将不能使用下标进行快速直接读取。下面来具体看看字符串具体在内存中所占用的字节数。
字符串的长度和该字符串所占的字节数不相同。字符串的长度可以直接通过len()f方法来求,而字符串在内存中实际所占的字节数需要通过getsizeof()函数来计算。
import sys
#返回字符串所占字节数,返回78
print(sys.getsizeof('你好'))
#返回字符串长度,长度为2
print(len("你好"))
从以下的实验结果可以发现,一个空字符串在内存中就占了49个字节的内存。
Python内存中的数据,不管是int型还是字符串,都会额外占用一些内存空间保存一些信息,这些信息保存了字符串的一些基础信息,并且能够决定字符串所能进行的操作。Python一般会为字符串分配49到80个字节的额外空间。
下面这段代码分别展示了字符‘a’在三种不用的Unicode编码中所占的字节数。
import sys
#latin-1编码时'a'所占的字节数,其结果为:1
print(sys.getsizeof('ab')-sys.getsizeof('b'))
#ucs-2编码时'a'所占的字节数,其结果为:2
print(sys.getsizeof('a你好')-sys.getsizeof('你好'))
#ucs-4编码时'a'所占的字节数,其结果为:4
print(sys.getsizeof('a?')-sys.getsizeof('?'))
[转载] python中字符串编码形式及其所占字节相关推荐
- [转载] Python中字符串切片详解
参考链接: Python中的字符串切片 在python中,我们定义好一个字符串,如下所示. s = 'abcdefghijklmnop' 在python中定义个字符串然后把它赋值给一个变量.我们可以通 ...
- [转载] Python中字符串的处理方法
参考链接: Python字符串方法1(find,rfind,startwith,endwith,islower,isupper,lower,upper,swapcase和title) 1.字符串 1 ...
- [转载] python判断字符串中包含某个字符串_干货分享| Python中最常用的字符串方法
参考链接: Python中字符串string capitalize 字符串是字符序列.Python中内置的string类代表基于Unicode国际字符集的字符串.除了Python中常见的操作外,字符串 ...
- python中字符串
目录 1.字符串 2.什么叫字符串驻留机制呢? 3.驻留机制的几种情况(交互模式) 4.sys中的intern方法强制2个字符串指向同一个对象 5.PyCharm对字符串进行了优化处理(所以上述两个例 ...
- Python中字符串的操作(图文详情)
以下操作均在pycharm pycharm官方下载地址: https://www.jetbrains.com/pycharm/download/#section=windows 目录 python中字 ...
- Python中字符串的驻留机制和常用方法
在python中字符串是基本数据类型,是一个不可变的字符序列. 字符串的驻留机制 使用三种不同的赋值方式赋值同一个字符串 a = 'python' b = "python" c = ...
- 站长在线Python精讲:Python中字符串编码转换encode编码和decode解码详解
欢迎你来到站长在线的站长学堂学习Python知识,本文学习的是<Python中字符串编码转换:encode编码和decode解码详解>.本知识点主要内容有:常用编码简介.使用encode( ...
- python字符串前面加f什么意思_详解Python中字符串前“b”,“r”,“u”,“f”的作用...
1.字符串前加 u 例:u"我是含有中文字符组成的字符串." 作用: 后面字符串以 Unicode 格式 进行编码,一般用在中文字符串前面,防止因为源码储存格式问题,导致再次使用时 ...
- python中字符串切片取奇数_Python中的字符串切片(截取字符串)的详解
Python中的字符串切片(截取字符串)的详解 字符串索引示意图 字符串切片也就是截取字符串,取子串 Python中字符串切片方法 字符串[开始索引:结束索引:步长] 切取字符串为开始索引到结束索引- ...
最新文章
- [Dijstra] 洛谷 P2939 改造路
- Hdu 4738 Caocao's Bridges (连通图+桥)
- 宝塔php安装那个合_通过宝塔面板一键搭建wordpress博客
- 基于墨刀的软件界面原型设计——小说搜索阅读软件
- Git 使用篇一:初步使用GitHub,下载安装git,并上传项目
- java验证码 memcache_java连接开启了sasl的memcache服务
- 使用jps来查看虚拟机状态
- ByWater Solutions支持在图书馆中使用开源
- JNDI学习总结(2)——JNDI数据源的配置
- 自己整理实现的python小工具
- 收藏 | 关于Mac Dock的10 个隐藏终端命令
- 关于判断卡BIN的修正
- Lattice Diamond 的安装以及license的获取
- 【科研绘图】Adobe illustrator加Origin组合绘图
- 离线维基百科全书阅读器(wikireader)
- MATLAB 的 colormap 函数详解
- 大型游戏后台实践浅谈
- Maxwell 转矩出现正负值情况解决措施
- while循环、方法(伟大的作品,不是靠力量而是靠坚持才完成的。)
- 如何下载河西区卫星地图高清版大图
热门文章
- kafka告警简单方案
- mount --bind的用处
- codesys com库_CoDeSys官方系统库在线下载,替换国内下载服务器教程
- linux python复制安装,复制一个Python全部环境到另一个环境,python另一个,导出此环境下安装的包...
- arima模型_[不说人话系列]-ARIMA模型
- 如何把密度函数化为标准正态二维分布_概率微课:第三章(22) 二维随机变量及分布函数定义...
- android 实例源码解释,Android Handler 原理分析及实例代码
- 后台使用orm多还是直接sql_Django应用app创建及ORM
- html高度没有滚动条,Div扩展了页面高度,但没有滚动条
- shell脚本单词去重多个文件