问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

Python3如何解决字符编码问题详解

发布网友 发布时间:2022-05-10 18:38

我来回答

2个回答

懂视网 时间:2022-05-10 23:00

Python3 最重要的一项改进之一就是解决了 Python2 中字符串与字符编码遗留下来的这个大坑。Python 编码为什么那么蛋疼?已经介绍过 Python2 字符串设计上的一些缺陷:
- 使用 ASCII 码作为默认编码方式,对中文处理很不友好。
- 把字符串牵强地分为 unicode 和 str 两种类型,误导开发者

当然这并不算Bug,只要处理的时候多留心也可以避免这些坑。但在 Python3两个问题都很好的解决了。

首先,Python3把系统默认编码设置为UTF-8

>>> import sys
>>> sys.getdefaultencoding()
'utf-8'
>>>

然后,文本字符和二进制数据区分得更清晰,分别用str和bytes表示。文本字符全部用str类型表示,str能表示Unicode字符集中所有字符,而二进制字节数据用一种全新的数据类型,用bytes来表示。

str

>>> a = "a"
>>> a
'a'
>>> type(a)
<class 'str'>
>>> b = "禅"
>>> b
'禅'
>>> type(b)
<class 'str'>

bytes

Python3 中,在字符引号前加‘b’,明确表示这是一个 bytes 类型的对象,实际上它就是一组二进制字节序列组成的数据,bytes 类型可以是 ASCII范围内的字符和其它十六进制形式的字符数据,但不能用中文等非ASCII字符表示。

>>> c = b'a'>>> c
b'a'>>> type(c)
<class 'bytes'>

>>> d = b'xe7xa6x85'>>> d
b'xe7xa6x85'>>> type(d)
<class 'bytes'>
>>>

>>> e = b'禅'
 File "<stdin>", line 1SyntaxError: bytes can only contain ASCII literal characters.

bytes类型提供的操作和str一样,支持分片、索引、基本数值运算等操作。但是str与bytes类型的数据不能执行+操作,尽管在py2中是可行的。

>>> b"a"+b"c"
b'ac'
>>> b"a"*2
b'aa'
>>> b"abcdefxd6"[1:]
b'bcdefxd6'
>>> b"abcdefxd6"[-1]
214
>>> b"a" + "b"
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
TypeError: can't concat bytes to str

encode 与 decode

str与bytes之间的转换可以用encode和从decode方法。

encode负责字符到字节的编码转换。默认使用UTF-8编码准换。

>>> s = "Python之禅"
>>> s.encode()
b'Pythonxe4xb9x8bxe7xa6x85'
>>> s.encode("gbk")
b'Pythonxd6xaexecxf8'

decode负责字节到字符的解码转换,通用使用UTF-8编码格式进行转换。

>>> b'Pythonxe4xb9x8bxe7xa6x85'.decode()
'Python之禅'
>>> b'Pythonxd6xaexecxf8'.decode("gbk")
'Python之禅'

热心网友 时间:2022-05-10 20:08

我不知道Python3编码有什么问题
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
加固一根柱子要多久 加固单个柱子需耗费多少时间 自建房柱子不在一条线上补救措施 房事过后精子流出是什么原因 还有想上厕所的感觉 每次做爱后,一射精过后就想急着上厕所。请问这是什么原因? 每次正常射精后,我都有想上厕所的感觉,请问这正常不正常 奥木尔鱼种群现状 奥木尔鱼是海洋生物吗 奥木尔鱼的介绍 奥木尔鱼简介 公司名义的房子过户费用是多少 java.lang是什么意思 JAVA语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义? 中国银行长城高校学生卡主要功能有啥? 深圳中行长城校园卡是什么? 中行现在还能不能办理学生借记卡呢?? 介绍一下中国银行宁波长城高校学生卡 我能办中国银行长城高校学生卡么 我想办一张中国银行的储蓄卡,用学生卡可以办吗? 中国银行长城高校学生卡主要功能有啥 中国银行宁波长城高校学生卡适用对象都有哪些? 求卓依婷-卓依婷/欢喜过新年 mp3音乐网盘资源 中行长城高校学生卡是什么卡? 中国银行宁波长城高校学生卡适用对象有哪些? 谁知道哪里可以下载新年歌曲(像卓依婷唱的那种)的视频MV,是想在电视上看的,格式可以自己转,就是要 中国银行长城高校学生卡给我介绍一下 我的耳朵边起了一个小疙瘩一直痒是怎么回事? 求超市里经常播放的拜年歌曲,歌名就是《拜年》,不知道谁唱的。女声 除了香香,中国娃娃,卓依婷版的 卓依婷小时候唱的一首过年歌曲叫什么名字? 中行长城高校学生卡适用对象有哪些? 中国银行长城高校学生卡介绍 噬血狂袭女儿穿越回来是哪一集 求噬血狂袭消失的圣枪篇高清百度云资源 噬血狂袭弱问 etc拆下后按钮不动,还能正常用么 噬血狂袭动画耗费了小说多少卷的内容?小说最后估计能出多少卷? 怎样windows7中,切换鼠标左右键,即主次键 win7怎么更换鼠标左右键顺序,我在鼠标键设置中调成了左手习惯,没有作用... win7家庭版 每次打开电脑鼠标左键不好用,都需要打开任务管理起,然后鼠标才好用,求解,别说重装系统 win7有没有为特定软件设置鼠标左右键互换 windows xp下电脑的鼠标左右键如何互换? 幼儿园活动室有哪几种类型? 黄瓜饼怎么炒的做法 怎么能把扫描件转换成WORD或E表 一个可以同时在平板电脑和手机登录吗?如果可以手机和平板电脑都可以同时接收消息吗? 怎样根据图像判断是什么半球和什么节气 那如果我将90°w改成90°E呢? 牛仔背带短裤的搭配 ipad装qq企业版邮箱 股票里公募增发是什么意思。股票名后面有个标志是什么意思? 华为手机和苹果平板电脑能同时登录一个吗? 咱们国家现有心理咨询师多少人?