Python3 中的 str 和 bytes

Python3 中的 str 和 bytes

与 Python2.X 不同,Python3.X 严格区分了 str 和 bytes 两种类型。文本为 Unicode,由 str 类型表示;二进制数据则由 bytes 表示。

Python3.X 不会以任意隐式的方式混用 str 和 bytes。因此使用者不能拼接字符串和字节包,也无法在字节包里搜索字符串(反之亦然),也不能将字符串传入参数为字节包的函数(反之亦然)。

例如 Python3.X 中的socket.send()函数,如果传入未编码的字符串,会报错:

>>> client.send("test str")

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: a bytes-like object is required, not ‘str‘

>>> client.send(b"test str")  #将参数转换成 bytes 类型
8                           #返回发送的数据长度

编码发展的历史

在计算机历史的早期,美国为代表的英语系国家主导了整个计算机行业,26个英文字母组成了多样的英语单词、语句、文章。因此,最早的字符编码规范是ASCII码,一种8位(即1个字节)的编码规范,它可以涵盖整个英语系的编码需要。

编码是什么?编码就是把一个字符用一个二进制来表示。我们都知道,所有的东西,不管是英文、中文还是符号等等,最终存储在磁盘上都是01010101这类东西。在计算机内部,读取和存储数据归根结底,处理的都是0和1组成的比特流。问题来了,人类看不懂这些比特流,如何让这些010101对人类变得可读呢?于是出现了字符编码,它是个翻译机,在计算机内部某个地方,偷偷帮我们将比特流翻译成人类可以直接理解的文字。对于一般用户,不需要知道这个过程是什么原理,是怎么执行的。但是对于程序员却是个必须搞清楚的问题。

ASCII编码为例,它规定1个字节8个比特位代表1个字符的编码,逐个字节进行解读。例如:01000001表示大写字母A,有时我们会用65这个十进制来表示A在ASCII中的编码。8个比特位,可以无重复地最多表示2的8次方个字符;但标准的ASCII码 只有7位,码值范围是0-127,最高位为0。

后来,计算机得到普及,中文、日文、韩文等等国家的文字需要在计算机内表示,像ASCII这种单字节编码已经远远不够了,于是标准组织制定出了UNICODE(万国码),它规定任何一个字符(不管哪国的)至少以两个字节表示。其中,英文字母就是用2个字节,而汉字是3个字节。这个编码虽然很好,满足了所有人的要求,但是它不兼容ASCII,同时还占用较多的空间和内存。而在计算机世界更多的字符是英文字母,明明可以1个字节就能够表示,非要用2个,就造成了空间资源的浪费了。

于是UTF-8编码应运而生,它规定英文字母系列用1个字节表示,汉字用3个字节表示等等。因此,它兼容ASCII,可以解码早期的文档。UTF-8很快就得到了广泛的应用。

在编码的发展历程中,我国还创造了自己的编码方式,例如GBKGB2312BIG5。他们只局限于在国内使用,不被国外认可。在GBK编码中,中文汉字占2个字节。

bytes 和 str 之间的转换

test0 = ‘abc‘
test1 = b‘abc‘
print(type(test0), test0) --> <class ‘str‘> ‘abc‘
print(type(test1), test1) --> <class ‘bytes‘> b‘abc‘

test2 = bytes(test0, ‘utf-8‘)
test3 = str(test1, ‘utf-8‘)
test4 = str(test1)
print(type(test2), test2) --> <class ‘bytes‘> b‘abc‘
print(type(test3), test3) --> <class ‘str‘> ‘abc‘
print(type(test4), test4) --> <class ‘str‘> "b‘abc‘"

test5 = test0.encode() #参数可输入编码格式,默认utf-8
test6 = test1.decode()
print(type(test5), test5) --> <class ‘bytes‘> b‘abc‘
print(type(test6), test6) --> <class ‘str‘> ‘abc‘

原文地址:https://www.cnblogs.com/Ashenone/p/9031516.html

时间: 2024-11-10 11:31:37

Python3 中的 str 和 bytes的相关文章

Python 3中的str和bytes类型

Python3 中的str和bytes类型 Python3最重要的新特性之一是:对字符串和二进制数据流做了明确的区分.文本总是Unicode,由str类型表示,二进制数据则由bytes类型表示.Python3不会以任何隐式的方式混用str和bytes,我们不能拼接字符串和字节流,也无法在字节流里搜索字符串(反之亦然),也不能将字符串传入参数为字节流(反之亦然). 编码发展的历史 在bytes和str之前,需要先说说关于编码的发展.在计算机历史的早期,美国为代表的英语系国家主导了整个计算机行业,2

python3 中encode 和decode的使用方法。

编码: 将文本转换成字节流的过程.即Unicode----------->特定格式的编码方式,产生特定的字节流保存在硬盘中(一般为utf-8格式). 解码: 将硬盘中的字节流转换成文本的过程.即特定格式的字节流------------->Unicode. 注意: 在内存中写的所有的字符,一视同仁,都是Unicode编码,但只有往硬盘保存或者基于网络传输时,才能确定你输入的字符是英文还好汉文,这就是Unicode转换成其他编码格式的过程. 在Python3中的字符串类型: 文本字符串类型: 即我

Python3中内置类型bytes和str用法及byte和string之间各种编码转换

Python 3最重要的新特性大概要算是对文本和二进制数据作了更为清晰的区分.文本总是Unicode,由str类型表示,二进制数据则由bytes类型表示.Python 3不会以任意隐式的方式混用str和bytes,正是这使得两者的区分特别清晰.你不能拼接字符串和字节包,也无法在字节包里搜索字符串(反之亦然),也不能将字符串传入参数为字节包的函数(反之亦然). python3.0中怎么创建bytes型数据 1 2 bytes([1,2,3,4,5,6,7,8,9]) bytes("python&q

python3.x中str,bytes类型相关转化

在研究Python3.x的过程中,遇到的一个纠结了我几天的问题:总是提示"a bytes-like object is required,not 'str' " 在python3.x里增加了bytes类型,并且对str方法进行了修改,让str类型和bytes类型可以相互转换. #!/usr/bin/env python # -*- coding:utf-8 -*- a = "哈哈" #字符串转换成字节 b = bytes(a,encoding='utf-8') pr

python2 与python3中最大的区别(编码问题bytes&amp;str

1,在python2.x 中是不区分bytes和str类型的,在python3中bytes和str中是区分开的,str的所有操作bytes都支持 python2 中 >>> s = "abcdefg" >>> b = s.encode()    #或者使用下面的方式 >>> b = b"abcdefg">>> type(b)<type 'str'> python3中     #str

python3 中bytes与str类型

python3最重要的新特性之一就是对字符串和二进制流做了明确的区分.文本总是unicode,由str类型表示用于显示.二进制则是由bytes类型表示,用于存储和传输.bytes是byte的序列,而str是unicode的序列.Python3不会以任意隐式的方式混用str和bytes,不能拼接字符串和字节流,也无法在字节流里搜索字符串(反之亦然).也不能将字符串传入参数为字节流的函数(反之亦然). str与bytes之间的转换关系:str-->encode()-->bytes--->de

python3中的bytes和string

原文链接:https://www.cnblogs.com/abclife/p/7445222.html python 3中最重要的新特性可能就是将文本(text)和二进制数据做了更清晰的区分.文本总是用unicode进行编码,以str类型表示:而二进制数据以bytes类型表示. 在python3中,不能以任何隐式方式将str和bytes类型二者混合使用.不可以将str和bytes类型进行拼接,不能在str中搜索bytes数据(反之亦然),也不能将str作为参数传入需要bytes类型参数的函数(反

Python3中bytes和HexStr之间的转换

1 Python3中bytes和HexStr之间的转换 ByteToHex的转换 def ByteToHex( bins ): """ Convert a byte string to it's hex string representation e.g. for output. """ return ''.join( [ "%02X" % x for x in bins ] ).strip() HexToByte的转换 de

python3.5 的str类型和bytes类型的转换

在python3.x里增加了bytes类型,并且对str方法进行了修改,让str类型和bytes类型可以相互转换. #!/usr/bin/env python # -*- coding:utf-8 -*- a = "哈哈" #字符串转换成字节 b = bytes(a,encoding='utf-8') print(b) b1 = bytes(a,encoding='gbk') print(b1) #将字节转换成字符 c=str(b,encoding='utf-8') print(c)