iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >【Python3】02、python编码
  • 271
分享到

【Python3】02、python编码

python 2023-01-31 08:01:30 271人浏览 八月长安

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

摘要

一、ASCII、Unicode和UTF-8的区别       因为字符编码的问题而苦恼不已,于是阅读了大量的博客,再进行了一定的测试,基本搞清楚了编码问题的前因后果。1、字符集和字符编码      计算机中储存的信息都是用二进制数表示的;而

一、ASCII、Unicode和UTF-8的区别

       因为字符编码的问题而苦恼不已,于是阅读了大量的博客,再进行了一定的测试,基本搞清楚了编码问题的前因后果。

1、字符集和字符编码

      计算机中储存的信息都是用二进制数表示的;而我们在屏幕上看到的英文、汉字等字符是二进制数转换之后的结果。通俗的说,按照何种规则将字符存储在计算机中,如'a'用什么表示,称为"编码";反之,将存储在计算机中的二进制数解析显示出来,称为"解码",如同密码学中的加密和解密。在解码过程中,如果使用了错误的解码规则,则导致'a'解析成'b'或者乱码。

字符集(Charset):是一个系统支持的所有抽象字符的集合。字符是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等。

字符编码(Character Encoding):是一套法则,使用该法则能够对自然语言的字符的一个集合(如字母表或音节表),与其他东西的一个集合(如号码或电脉冲)进行配对。即在符号集合与数字系统之间建立对应关系,它是信息处理的一项基本技术。通常人们用符号集合(一般情况下就是文字)来表达信息。而以计算机为基础的信息处理系统则是利用元件(硬件)不同状态的组合来存储和处理信息的。元件不同状态的组合能代表数字系统的数字,因此字符编码就是将符号转换为计算机可以接受的数字系统的数,称为数字代码。


常见字符集名称:ASCII字符集、GB2312字符集、BIG5字符集、GB18030字符集、Unicode字符集等。计算机要准确的处理各种字符集文字,需要进行字符编码,以便计算机能够识别和存储各种文字。


2、ASCII码

       我们知道,在计算机内部,所有的信息最终都表示为一个二进制的字符串。每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256种状态,这被称为一个字节(byte)。也就是说,一个字节一共可以用来表示256种不同的状态,每一个状态对应一个符号,就是256个符号,从00000000到11111111。

上个世纪60年代,美国制定了一套字符编码,对英语字符与二进制位之间的关系,做了统一规定。这被称为ASCII码,一直沿用至今。

ASCII码一共规定了128个字符的编码,比如空格"SPACE"是32(二进制00100000),大写的字母A是65(二进制01000001)。这128个符号(包括32个不能打印出来的控制符号),只占用了一个字节的后面7位,最前面的1位统一规定为0。


3、非ASCII编码

      英语用128个符号编码就够了,但是用来表示其他语言,128个符号是不够的。比如,在法语中,字母上方有注音符号,它就无法用ASCII码表示。于是,一些欧洲国家就决定,利用字节中闲置的最高位编入新的符号。比如,法语中的é的编码为130(二进制10000010)。这样一来,这些欧洲国家使用的编码体系,可以表示最多256个符号。

但是,这里又出现了新的问题。不同的国家有不同的字母,因此,哪怕它们都使用256个符号的编码方式,代表的字母却不一样。比如,130在法语编码中代表了é,在希伯来语编码中却代表了字母Gimel (),在俄语编码中又会代表另一个符号。但是不管怎样,所有这些编码方式中,0--127表示的符号是一样的,不一样的只是128--255的这一段。

至于亚洲国家的文字,使用的符号就更多了,汉字就多达10万左右。一个字节只能表示256种符号,肯定是不够的,就必须使用多个字节表达一个符号。比如,简体中文常见的编码方式是GB2312,使用两个字节表示一个汉字,所以理论上最多可以表示256x256=65536个符号。

中文编码的问题需要专文讨论,这篇笔记不涉及。这里只指出,虽然都是用多个字节表示一个符号,但是GB类的汉字编码与后文的Unicode和UTF-8是毫无关系的。


4、Unicode

      世界上存在着多种编码方式,同一个二进制数字可以被解释成不同的符号。因此,要想打开一个文本文件,就必须知道它的编码方式,否则用错误的编码方式解读,就会出现乱码。为什么电子邮件常常出现乱码?就是因为发信人和收信人使用的编码方式不一样。

可以想象,如果有一种编码,将世界上所有的符号都纳入其中。每一个符号都给予一个独一无二的编码,那么乱码问题就会消失。这就是Unicode,就像它的名字都表示的,这是一种所有符号的编码。

Unicode当然是一个很大的集合,现在的规模可以容纳100多万个符号。每个符号的编码都不一样,比如,U+0639表示阿拉伯字母ain,U+0041表示英语的大写字母A,U+4E25表示汉字"严"。具体的符号对应表,可以查询unicode.org,或者专门的汉字对应表。


5. Unicode的问题

      需要注意的是,Unicode只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储。

比如,汉字"严"的unicode是十六进制数4E25,转换成二进制数足足有15位(100111000100101),也就是说这个符号的表示至少需要2个字节。表示其他更大的符号,可能需要3个字节或者4个字节,甚至更多。

这里就有两个严重的问题,第一个问题是,如何才能区别Unicode和ASCII?

计算机怎么知道三个字节表示一个符号,而不是分别表示三个符号呢?

第二个问题是,我们已经知道,英文字母只用一个字节表示就够了,如果Unicode统一规定,每个符号用三个或四个字节表示,那么每个英文字母前都必然有二到三个字节是0,这对于存储来说是极大的浪费,文本文件的大小会因此大出二三倍,这是无法接受的。

它们造成的结果是:

1)出现了Unicode的多种存储方式,也就是说有许多种不同的二进制格式,可以用来表示Unicode。2)Unicode在很长一段时间内无法推广,直到互联网的出现。


6.UTF-8

      互联网的普及,强烈要求出现一种统一的编码方式。UTF-8就是在互联网上使用最广的一种Unicode的实现方式。其他实现方式还包括UTF-16(字符用两个字节或四个字节表示)和UTF-32(字符用四个字节表示),不过在互联网上基本不用。重复一遍,这里的关系是,UTF-8是Unicode的实现方式之一。

UTF-8最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。

UTF-8的编码规则很简单,只有二条:

1)对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。

2)对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。


现在捋一捋:

   ASCII编码是1个字节,而Unicode编码通常是2个字节,utf-8是Unicode的实现方式之一,它是一种可变长的编码方式,根据符号而变化字节长度,用1-4个字节表示一个符

       Unicode不兼容ASCII码,Utf-8兼容ASCII码

   unicode一个中文字符占2个字节,而UTF-8一个中文字符占3个字节。从unicode到uft-8并不是直接的对应,而是要过一些算法和规则来转换。


二、python编码问题

1、python字符串编码问题

在最新的python 3版本中,字符串是以Unicode编码的,也就是说,Python的字符串支持多语言,

例如: 

In [1]: print("中国")
中国

In [2]: type("中国")
Out[2]: str

       由于Python的字符串类型是str,在内存中以Unicode表示,一个字符对应若干个字节。

文件里能保存str/bytes,传输只能是bytes。

python3对bytes类型的数据用带b前缀的单引号或双引号表示:

In [36]: x = b"hello"

In [37]: type(x)
Out[37]: bytes

In [38]: print(x)
b'hello'

In [39]: y = "hello"

In [40]: type(y)
Out[40]: str

In [41]: print(y)
hello

In [19]: b'中国'        #bytes只能包含ASCII字符,不能显示中文,这里报错了
  File "<ipython-input-19-5365596ad95c>", line 1
    b'中国'
         ^
SyntaxError: bytes can only contain ASCII literal characters.


In [8]: b1 = "中国".encode()       #写入的不是str,而是经过UTF-8编码的bytes

In [9]: b1
Out[9]: b'\xe4\xb8\xad\xe5\x9b\xbd'

In [10]: type(b1)
Out[10]: bytes

要注意区分'hello'和b'hello',前者是str,后者虽然内容显示得和前者一样,但bytes的每个字符都只占用一个字节。

        decode是解码,将其它编码的字符串解码成unicode,

        encode的编码,将unicode字符串编码成bytes,

        这里需要注意,这个两个过程和ASCII码没有什么关系

之前一直错误地认为decode和encode的作用是将字符串编码在unicode和ASCII转换,

       Python 3最重要的新特性大概要算是对文本和二进制数据作了更为清晰的区分。

       Python 3不会以任意隐式的方式混用str和bytes,正是这使得两者的区分特别清晰。你不能拼接字符串和字节包,也无法在字节包里搜索字符串(反之亦然),也不能将字符串传入参数为字节包的函数(反之亦然)。这是件好事。



--结束END--

本文标题: 【Python3】02、python编码

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

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

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 【Python3】02、python编码
    一、ASCII、Unicode和UTF-8的区别       因为字符编码的问题而苦恼不已,于是阅读了大量的博客,再进行了一定的测试,基本搞清楚了编码问题的前因后果。1、字符集和字符编码      计算机中储存的信息都是用二进制数表示的;而...
    99+
    2023-01-31
    python
  • Python3 字符编码
    原文出处:http://www.cnblogs.com/284628487a/p/5584714.html编码字符串是一种数据类型,但是,字符串比较特殊的是还有一个编码问题。因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才...
    99+
    2023-01-31
    字符
  • Python Learning: 02
      OK, let's continue. Conditional Judgments and Loop if if-else if-elif-else while for break continue multiple loop ...
    99+
    2023-01-30
    Python Learning
  • Python3的URL编码解码
    博主最近在用python3比较强大的Django开发web的时候,发现一些url的编码问题,在浏览器提交请求api时,如果url中包含汉子,就会被自动编码掉。呈现的结果是 ==> %xx%xx%xx。如果出现3个百分号为一个原字符则...
    99+
    2023-01-31
    URL
  • python day 02
    格式化输出 %s:字符串占位符 %d:数字占位符 例如: "你好%s,我是%s,今年%d岁了。" % ("小明","小红",18) 输出: 你好小明,我是小红,今年18岁了。 ...
    99+
    2023-01-31
    python day
  • PYTHON3编码再探究
    原文请戳本文大概需要10分钟看完1 看一段简单代码要求:Linux编辑器,python3版本vim test1.py# test1.py内容:import sys, locales = "王佳"print(s)print(sys.getde...
    99+
    2023-06-02
  • Python3的编码问题
    ​介绍Python3中的编码问题前,第一个段落对字节、ASCII​与Unicode与UTF-8等进行基本介绍,如果不对这几种编码犯头晕,可直接跳过。 ASCII​与Unicode与UTF-8与GBK 首先从老大哥说起。跟很多人一样,...
    99+
    2023-01-31
  • 关于 Python3 的编码
    Python3 中 str 与 bytes 的转换:The bytes/str dichotomy in Python 3字符与 Unicode 编号之间的转换# 字符转 Unicode 编号 >>> ord('...
    99+
    2023-01-31
  • 【Python】02、Python过程型
    Python过程型程序设计快速入门数据结构     程序=数据结构+算法数据结构:     通过某种方式(例如对元素进行编号)组织在一起的数据元素的集合,这些数据元素可以是数字或者字符,甚至可以是其它的数据结构。      python的最...
    99+
    2023-01-31
    过程 Python
  • Python:一图看懂Python2还是Python3的编码
    无论是Python2还是Python3,都使用unicode作为内存编码,简称内码。保存在python解释器内存中的文本,输出到屏幕、编辑器,或者保存成文件的时候,都要将内码转换成utf8或者gbk等编码格式;同样,python解释器从输入...
    99+
    2023-06-02
  • Python图形编程探索系列-02-框架
    跳转到我的博客 在主窗口root中放置三个容器用于容纳组件,容器采用框架设计。 import tkinter as tk root = tk.Tk() root.geometry('800x600+200+200') ro...
    99+
    2023-01-30
    框架 图形 系列
  • Python全栈day 02
    一、循环语句 while 用法 num = 1 while num <= 10: print(num) num += 1 # 循环打印输出1-10 while else 用法 num = 1 while n...
    99+
    2023-01-31
    Python day
  • python3基础学习(base64编码
    import base64 import sys a = base64.b64encode((sys.argv[1]).encode(encoding='utf-8')).decode() b = base64.b64decode(sys...
    99+
    2023-01-31
    基础
  • 2019-02-18 扩展Python控
    "中文编程"知乎专栏原文地址 续前文扩展Python控制台实现中文反馈信息, 实现了如下效果: >>> 学 Traceback (most recent call last): File "<console&...
    99+
    2023-01-30
    Python
  • python3的url编码和解码,自定义
    因为很多时候要涉及到url的编码和解码工作,所以自己制作了一个类,废话不多说 码上见!# coding:utf-8 import urllib.parse class Urlchuli(): """Url处理类,需要传入两个实...
    99+
    2023-01-31
    自定义 url
  • 使用python3的base64编解码实
    把写内容过程中常用的内容段记录起来,下面的资料是关于使用python3的base64编解码实现字符串的简易加密解密的内容。 import base64 copyright = 'Copyright (c) 2012 Doucub...
    99+
    2023-01-31
    编解码
  • python日常笔记-02
    #!/usr/bin/python#-- coding: UTF-8 --(1).'''在python中,for循环后的in跟随一个序列的话,循环每次使用的是序列元素,而不是序列的下标'''s = 'saflasngsagleaoiga'f...
    99+
    2023-01-31
    日常 笔记 python
  • 2019-02-13 Python爬虫问
    soup=BeautifulSoup(html.text,'lxml') #data=soup.select('body > div.main > div.ctr > div > div.newsmcont &g...
    99+
    2023-01-30
    爬虫 Python
  • Python 开发环境搭建(02):Python 3.7 + Redhat 7 源码安装
    准备编译环境(环境如果不对的话,可能遇到各种问题,比如wget无法下载https链接的文件)yum groupinstall 'Development Tools'yum install zlib-devel bzip2-d...
    99+
    2023-06-02
  • 1.Python3 变量 字符编码 注释
    一、变量声明变量123#_*_coding:utf-8_*_ name = "Alex Li"上述代码声明了一个变量,变量名为: name,变量name的值为:"Alex Li" 变量定义的规则:变量名只能是 字母、数字或下划线的任意组合变...
    99+
    2023-01-31
    注释 变量 字符
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作