返回顶部
首页 > 资讯 > 后端开发 > Python >如何用Python理清编码问题
  • 726
分享到

如何用Python理清编码问题

2023-06-15 14:06:45 726人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

今天就跟大家聊聊有关如何用python理清编码问题,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。万国码为解决语言各自为政的编码,人们提出了Unicode编码方案,这个方案简单粗暴:把

今天就跟大家聊聊有关如何用python理清编码问题,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

万国码

为解决语言各自为政的编码,人们提出了Unicode编码方案,这个方案简单粗暴:把世界上所有语言字符统一编码。Unicode的两种方案UCS-2和UCS-4,可使用空间分别达到2^16和2^32个:外星人到访地球之前,应该是够用的。

我们看几个字符的Unicode编码码位(code point)是怎样的:

ls = 'abAB巩★☆' print([ord(l) for l in ls])

结果:[97, 98, 65, 66, 24041, 9733,  9734]。可见,字母abAB的Unicode码位和其ASCII码位一致,所以字符为字母时两者兼容,而汉字巩的码位为24041(0x5de9),与之前的GB系列编码47534(0xb9ae)不同,所以Unicode和GB系列编码之间是不完全兼容的:只有ASCII部分兼容。

所有国家的人都使用Unicode编码之后,扩展、乱码问题都不复存在:所有人类语言字符都有了一个统一的编码码位,沟通中我们写出的每个数字编码,都有唯一的字符与他对应。Python中chr函数返回Unicode码位对应的字符。

>>> print([chr(i) for i in [123,957,24041]]) ['{', 'ν', '巩']

那么我们可以使用强大的Unicode进行编码了么?

>>> ls = 'abAB巩★☆' >>> ls.encode('Unicode') Traceback (most recent call last):   File "<stdin>", line 1, in <module> LookupError: unknown encoding: Unicode

未知编码Unicode!这是因为,并不存在Unicode码这种编码形式,Unicode只是一个码位表,它只是建立了字符和整数之间的映射。至于整数码位(code  point)如何存储成字节,先存高位低位,有没有特殊标志,Unicode并不直接决定,而是交给具体编码来考虑这些细节:UTF-32,UTF-16和UTF-8。

UTF-32 四字节为单位

UTF-32,顾名思义,是用32位,也就是四个字节来存储一个字符的编码方案。

>>> 'aA巩'.encode('utf-32LE') b'a\x00\x00\x00A\x00\x00\x00\xe9\x5d\x00\x00'

可见,所有的字符,都使用了四个字节来存储:每个字节除了Unicode码位之外,不足用\x00来填充。此法简单明了,Unicode码位不用转换,直接填充。但大量的\x00造成了极大的浪费。有没有办法解决这种浪费了?压缩下用两位行不行?

UTF-16 两字节为单位

当用UTF-16来编码时。

>>> 'aA巩'.encode('utf-16LE') b'a\x00A\x00\xe9\x5d'

两个字节对绝大多数Unicode码位来说是够用的,不够用的话系统自动用四位表示。这是系统实现,我们无需关心。UTF-16编码后的字节序列和字符,依然能够一一对应起来。UTF-16其实有两种编码方法,分别为上例的UTF-16LE和如下的UTF-16BE,测试

>>> 'aA巩'.encode('utf-16BE') b'\x00a\x00A\x5d\xe9'

两者基本一样,只是高低字节位置发生了颠倒。LE和BE后缀,表示小字节序(little endian)和大字节序(big  endian)。这是计算机内部关于字节的MSB(大权重字节)放在字节的开头还是结尾的具体实现细节。

《格列佛游记》中,小人国国民为吃鸡蛋先吃大头或小头,针锋相对,组成了两个军事对立集团big endians和little  endians,相互间多次发动战争。

那么两个字节就是Unicode编码的极限了么?

UTF-8 变长字节编码

能不能用可变数目的字节来存储文本呢?如果存储的是英文文本的话,每个字符只用一个字节就可以;汉字的话,再进行扩展。如此来进一步节省存储空间。答案是可以的,这就是可变长度编码UTF-8。

>>> 'aA巩'.encode('utf-8') b'aA\xe5\xb7\xa9'

这是目前最短的字节序列,因为aA分别存储成了一个字节。需要注意的是,UTF-32和UTF-16中,巩的字节序列是0x5de9,但在UTF-8中,字节序列变成了0xe5b7a9。这说明UTF-8编码不是简单地把Unicode码位直接存储进字节序列中,而是进行了某些转换。这些转换,保证了英文用一位存储,汉语等较大字符多字节存储。那么是如何转换的呢?

UTF-8 编码转换规则

本部分过于细节,可略过。UTF-8实现了可变长度的编码,为解码时区分可变长度究竟多长,需要在字节序列里使用特殊模板。UTF-8编码遵循以下规则:

  • 0x00-0x7F之间的码位,兼容ASCII码,单字节直接存储在以下模板 0*** ****

  • 0x80-0x7ff之间,使用两个字节存储,字节模板是110* **** 10** ****

  • 0x800-0xffff之间,使用三个字节存储,字节模板是1110 **** 10** **** 10** ****

  • 0x10000-0x1fffff之间,使用四个字节存储,字节模板是1111 0*** 10** **** 10** **** 10** ****

以汉字巩为例,其Unicode码位为0x6c49,二进制位110 1100 0100 1001。位于第三行范围,所以需要三个字节来存储,写出模板,1110  **** 10** **** 10** ****,使用二进制,从右向左填充,不足部分补零,可得结果1110 0110 1011 0001 1000  1001,十六进制为0xe6 0xb7  0x89,所以巩编码为UTF-8的字节序列形式为0Xe6b789。让我们从UTF-8编码转换细节中,回到UTF三种编码的长度问题上来。

UTF三种编码后的长度

以上三种编码方式,由于压缩率不用,导致文件长度也不同,以下程序比较当文本为汉字和英语内容时,三种不同编码的长度:

es = 'abcdefghij' cs = '莫愁前路无知己,天下谁人不识君。'  codes = ['utf-32le','utf-16le','utf-8']  print([len(es.encode(code)) for code in codes]) print([len(cs.encode(code)) for code in codes])

输出为 [40, 20, 10] [64, 32, 48]  可见,对于英文来说,UTF-8比UTF-16和UTF-32编码都要有优势;对汉字来说,最有优势的反而是UTF16编码。这是因为UTF-16编码中,大部分汉字采用2Byte存储,而UTF-8中汉字需要三个字节存储。在日常生活中,因为考虑到最大兼容性,UTF-8使用的最为广泛。至此,我们从ASCII码到GB系列编码,再到Unicode和相应的UTF系列编码,一路进化,拥有了一个包罗万码,不会乱码和有较高压缩率的字符编码系统。可以使用了么?没有!因为我们只是编码了文本自身,并没有记载具体用了那个编码:当我们发送一份文件后,除非告诉对方,否则对方不知道应该该用什么编码打开它。解决这个问题,我们留待下篇文章分析。

  • Unicode统一了世界各语言字符。Unicode几种编码形式中;

  • UTF-32简单,但浪费严重。

  • UTF-16使用两个字节为单位存储,节省了空间。

  • UTF-8使用一个字节直接存储,是效率、空间的平衡。 

看完上述内容,你们对如何用Python理清编码问题有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注编程网Python频道,感谢大家的支持。

--结束END--

本文标题: 如何用Python理清编码问题

本文链接: https://lsjlt.com/news/280634.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 如何用Python理清编码问题
    今天就跟大家聊聊有关如何用Python理清编码问题,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。万国码为解决语言各自为政的编码,人们提出了Unicode编码方案,这个方案简单粗暴:把...
    99+
    2023-06-15
  • python编码问题
    基本常识ASCII编码是1个字节bytes,而Unicode编码通常是2个字节1bytes=8bit在计算机内存中,统一使用Unicode编码,当需要保存到硬盘或者需要传输的时候,就转换为UTF-8编码。 字母"A"用ASCII编码是十进...
    99+
    2023-01-31
    python
  • python如何解决中文编码乱码问题
    小编给大家分享一下python如何解决中文编码乱码问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、什么是字符编码。要彻底解决字符编码的问题就不能不去了解到底...
    99+
    2023-06-25
  • python编码问题汇总
    目录一、了解字符编码的知识储备1. 文本编辑器存取文件的原理(nodepad++,pycharm,word)2. python解释器执行py文件的原理 二、字符编码简介三、...
    99+
    2024-04-02
  • Python中的编码问题
    视频汇总首页:http://edu.51cto.com/lecturer/index/user_id-4626073.html对于Python的初学者来说,编码问题相当令人头疼。本文就根据我在学习过程中遇到的问题简单谈一下Python中的编...
    99+
    2023-01-31
    Python
  • Python之string编码问题
    目录一、前言什么是编码?什么是字符集二、影响Python执行的编码方案1.Python解释器的默认编码2.Python源文件文件编码3.操作系统的语言设置4.Terminal使用的编...
    99+
    2023-02-28
    Python string编码 string编码 Python编码
  • python 编码问题 utf8 ?Un
    用python,之前运行的很好,但是UnicodeDecodeError: 'utf8' codec can't decode byte 0xc4 in position 4: invalid continuation byte添...
    99+
    2023-01-31
    python
  • Python中文编码问题
        近日用Python写一个小程序,从数据库(MS SQL)中读取数据,对数据进行组织后发送到邮箱,在数据内容有中文的地方始终报错,汉字使用UTF-8进行编码倒是不报错了,但发送到邮箱的内容,从数据库中读取出来的汉字却成乱码了,经多方查...
    99+
    2023-01-31
    中文 Python
  • PHP如何处理中文字符编码问题
    PHP如何处理中文字符编码问题,需要具体代码示例 在开发PHP应用程序时,处理中文字符编码问题是一个常见的挑战。特别是在处理用户输入、数据库操作以及输出到网页等场景中,正确处理中文字符...
    99+
    2024-04-02
  • 如何解决mysql编码问题
    解决mysql编码问题的方法更改数据库安装时的字符编码。打开mysql安装目录。找到my.ini文件,以记事本的方式打开。直接修改配置文件的字符编码为utf8,如:default-character-set=utf8character-se...
    99+
    2024-04-02
  • 如何解决Python unicode ascii编码在windows上的问题
    这期内容当中小编将会给大家带来有关如何解决Python unicode ascii编码在windows上的问题,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。unicode ascii编码在计算机的相关实际...
    99+
    2023-06-17
  • 详解python中文编码问题
    目录 1.        在Python中使用中文1.1     Windows控制台1.2     Wi...
    99+
    2022-06-02
    python中文编码 python 编码
  • 如何弄清Python的时间和日期问题
    如何弄清Python的时间和日期问题,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Python 程序中有很多内置模块可以处理日期和时间的方式,比如如calend...
    99+
    2023-06-02
  • 如何使用Python和Django处理编程中的算法问题?
    Python和Django是当前最受欢迎的编程语言和Web框架之一。它们提供了强大的工具和库,使得处理算法问题变得更加容易和高效。本文将介绍如何使用Python和Django处理编程中的算法问题。 一、 Python和Django的优势 P...
    99+
    2023-11-03
    日志 django 编程算法
  • Python 3.x中的编码和解码问题
    最近在极客学院学习爬虫,老师用的是2.x版本,而我电脑里的版本是3.x,于是在网页上查找在输出中文时如何正确输出。 我原以为2.x 3.x在很多语法上没什么区别,在解码decode上应该也差不多,没想到竟然发现,很多博客提到2....
    99+
    2023-01-31
    Python
  • python中文编码乱码问题的解决
    目录前言:一、什么是字符编码。1.ASCII2.GB23123.Unicode4.UTF-8二、Python2中的字符编码三、decode()与encode()方法四、一个字符编码的...
    99+
    2024-04-02
  • 如何处理Python3.4 使用pymssql 乱码问题
    在项目中发现这样一个问题:sqlserver数据库编码为gbk,使用python3.4+pymssql 查询,中文乱码,经过一番思考问题解决,下面把解决办法分享给大家: conn = pymssql....
    99+
    2022-06-04
    乱码 如何处理 pymssql
  • 如何理解Python RSS处理问题
    这期内容当中小编将会给大家带来有关如何解决Python RSS处理问题,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Python应用程序作为一个很好的 RSS 处理工具,下面文章进行介绍了一些可用于 RS...
    99+
    2023-06-17
  • 如何解决MySQL字符集编码问题
    这篇文章给大家分享的是有关如何解决MySQL字符集编码问题的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。项目中,用中断命令导入sql脚本,发现其报出编码错误,后来进过一番分析查询...
    99+
    2024-04-02
  • 如何解决PHP base64编码后解码乱码的问题
    如何解决PHP base64编码后解码乱码的问题 PHP base64编码后解码乱码的解决办法:用GET形式传递时,防止【+】号被替换成空格即可,代码为【$str = base64_decode(str_replace(" ","...
    99+
    2023-09-06
    servlet java html
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作