首页 > 编程语言 >python字符编码问题处理

python字符编码问题处理

时间:2023-02-03 22:55:28浏览次数:42  
标签:编码 中文 utf str 字符 python unicode UTF

编码

编码目的是让机器读懂语言
在python中,Python接受的是str
即使输入的数据是其它格式,在Python内部都会自动转为str

  • 编码集

因为电脑是根据二进制工作的,所以将二进制与每个字符对应起来形成一张表使得人类的语言能够让计算机读懂。例:ASCII集

  • ASCII编码集
    只考虑到英语世界的使用者,但是对于中文、日文、韩文就不够用了
  • GBK编码集
    GB2312由中国国家标准总局发布
    包括了汉字、拉丁字母、希腊字母、日文平假名及片假名字母、俄语西里尔字母在内。但是灭有包括罕见字和繁体字,于是后来出现GBK、GB1830
  • Unicode标准编码集
    是标准统一所有语言文字的标准编码集
    • 编码方式:一个字符对应编码集中的二进制数值
    • 实现方式(传输、储存):UTF-8、UTF-16
      本质上来说:Unicode是字符集,UTF-8是编码规则
    • 字符集: 为每一个「字符」分配一个唯一的 ID(学名为码位 / 码点 / Code Point);
    • 编码规则: 将「码位」转换为字节序列的规则(编码/解码 可以理解为 加密/解密 的过程)
  • Python3中的字符串

Python3中有两种表示字符串的类型:bytesstr,str类中包含了unicode字符串,非unicode编码如UTF-8、GBK被定义成了bytes
此处UTF-8定义为了非unicode编码的原因是,UTF-8是基于unicode的编码规则,但是与unicode有所不同,UTF-8合理地节省了位数,但是仍然是基于unicode的字符集
例:

c = '中文'
print(type(c),c)

c = c.encode('utf-8')#使用UTF-8将str类型编码为bytes类型
print(type(c),c)

c = c.decode()#使用默认方式将bytes类型解码为str类型
print(type(c),c)

#运行结果
#<class 'str'> 中文
#<class 'bytes'> b'\xe4\xb8\xad\xe6\x96\x87'
#<class 'str'> 中文

python3中encode()是将str类型转换为bytes类型,decode()是将bytes类型转换为str类型

解决乱码

  • Python解释器的编码问题
    指Python内部认为的字符str的编码,即一个str变量要转换为unicode时,Python解释器默认的转换方式不同导致乱码
    Python2默认转换方式是ascii码(不包含中文)
    可能原因:因为英文的unicode编码和ascii码编码相同
    Python3默认转换方式是utf-8,不会产生乱码
    在ASCII默认编码条件下对中文字符编码会出现错误,因为ASCII不能对中文进行编码
  • 中文字符str的解码问题
a = '中文'
print(a.encode('utf-8').decode('utf-8'))
#运行结果
#中文
a = '中文'
print(a.encode('utf-8').decode('gbk'))
#运行结果
#---------------------------------------------------------------------------
#UnicodeDecodeError                        Traceback #(most recent call last)
#~\AppData\Local\Temp\ipykernel_29164\1802307138.py in <module>
#      1 a = '中文'
#----> 2 print(a.encode('utf-8').decode('gbk'))

#UnicodeDecodeError: 'gbk' codec can't decode byte 0xad in position 2: illegal multibyte sequence

出现问题的原因为a中的str是属于Unicode编码集的,用GBK就会出错了

  • 文件读写编码
    使用read()读取文件内容,得到文件内容的格式如果不是utf-8
    而终端编码是utf-8与字符串编码方式不匹配,那么会导致乱码

总结

重中之重在于解决编码方式不同的问题,编码方式不同就会产生乱码

标签:编码,中文,utf,str,字符,python,unicode,UTF
From: https://www.cnblogs.com/KeepEarlyHours/p/17090654.html

相关文章

  • Python基本数据类型
    一、Number(数字)整型(int):通常被称为是整型或整数,是正或负整数,不带小数点。Python3整型是没有限制大小的,可以当作Long类型使用,所以Python3没有Python2的Long类型。......
  • Python中的关键字的用法
    Python有哪些关键字Python常用的关键字and,del,from,not,while,as,elif,global,or,with,assert,else,if,pass,yield,break,except,import,print,clas......
  • python django项目创建
    目标本文为创建django项目的第一步操作、实现项目创建、模块创建、虚拟环境指定、并实现健康检查接口一、环境准备安装python参考官方文档:https://www.python.org/down......
  • Python__23--对象
    1什么是对象?对象(Object)是一个应用系统中的用来描述客观事物的实体,是有特定属性和行为(方法)的基本运行单位。是类的一个特殊状态下的实例。对象可以是一个实体、一个名词、一......
  • Python__24--对象的特殊属性与特殊方法
    1特殊属性1.1dictclassA:passclassB:passclassC(A,B):def__init__(self,name,age):self.name=nameself.age=agex=C('Jack',20)print(x._......
  • how download file by url in python
    https://www.codingem.com/python-download-file-from-url/https://www.codingem.com/read-textfile-into-python-program/......
  • DRF请求解析编码,响应格式配置方法 及Response init实例化参数
    目录drf之请求Request能够解析前端传入的编码格式需求只接收json格式编码drf之响应Response能够响应的编码格式需求更改响应格式Response源码分析init参数重点drf之请求......
  • 【力扣算法题-Python】1、两数的和
    (【力扣-Python】1、两数的和)题目题目:两数之和。难度:简单。给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值target的那两个整数,并返......
  • #yyds干货盘点# LeetCode面试题:无重复字符的最长子串
    1.简述:给定一个字符串s,请你找出其中不含有重复字符的 最长子串 的长度。 示例 1:输入:s="abcabcbb"输出:3解释:因为无重复字符的最长子串是"abc",所以其长度为......
  • 字符串分割函数
    1intsplitstr(conststd::string&str,chartag)2{3vector<string>vec_str;4std::stringsubStr;5for(size_ti=0;i<str.length();......