了解python str to bytes中bytes,str和unicode的区别

君,已阅读到文档的结尾了呢~~
Python:bytes与strPython
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
Python:bytes与str
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口文本总是unicode字符集,用str类型表示。
二进制数据则由bytes表示。(通过socket在网络上传输数据时必须要用二进制格式)
Python不会以任何隐式的方式混用str和bytes,所以我们不能在代码中拼接字符串和字节包
当然字符串和字节,是可以被相互转换的。
借用一个其他的图来说明转换关系:
string 通过encode 编码成 bytes 类型,而bytes格式的数据又可以通过decode来解码成str类型。
encode 用来对string格式个数据进行编码:
str = '你好'
str.encode('UTF-8') --&表示源数据是什么格式的,不指定的话,默认为UTF-8
b'\xe4\xbd\xa0\xe5\xa5\xbd'
decode 用来对bytes格式的数据进行解码:
str = b'\xe4\xbd\xa0\xe5\xa5\xbd'
str.decode('UTF-8') --&表示把二进制数据解释成 什么格式的数据(默认UTF-8,待测)
阅读(...) 评论()用户名:莲的思念
文章数:63
评论数:17
访问量:15667
注册日期:
阅读量:1297
阅读量:3317
阅读量:449836
阅读量:1134476
51CTO推荐博文
1、unicode文本:在国际化应用程序中使用的宽字符字符串;二进制数据:表示绝对的字节值的字符串。Python 3.0为二进制数据提供了一种替代字符串类型,并且在其常规的字符串类型中支持Unicode文本(ASCII看作Unicode的一种简单类型)Python2.X为非ASCII Unicode文本提供一种替代字符串类型,并且在其常规的字符串类型中支持简单文本和二进制数据2、字符编码方法:ASCII编码定义了0-127的字符代码,每个字符存储在一个8位的字节中。但有时每个字符用一个字节表示并不够。Latin-1使用8位来表示一个字符,并且把值128-255用来表示一些符号和重音。Unicode文本通常叫做“宽字符”字符串,每个字符可能表示为多个字节要在内存中存储如此丰富的文本,就要确保字符与原始字节之间可以使用一种编码进行转换。编码是根据一个想要的编码名称,把一个字符串翻译为其原始字节的形式,解码是根据其编码名称,把一个原始字节翻译为字符串的形式。对于ASCII和latin-1来说,每一个字符映射为一个单个字节,因此不需要翻译工作。对于其他的编码格式,每个字符可能产生多个字节。例如UTF-8编码,采用可变的字节数方案。0-127的字符转换为一个字节,128-2047之间的字符转换为两个字节,每个字节拥有一 个128-255的值。2047以上的转换为3个或4个字节序列,序列中的每个字节的值在128-255之间。例如每一个中文字符,用utf-8进行编码后的字节码就用3个字节表示。由于编码的字符转换把字符分配给同样的代码,因此ASCII是UTF-8的子集。也就是说,一个ASCII字符也是一个有效的UTF-8字符。当数据存储时也是如此,每一个ASCII文件也是有效的UTF-8文件,但反过来就不对了。像ASCII,Latin-1,UTF-8以及其他的编码,都被认为是Unicode。encodings模块包含很多编码名称。Python带有大约100多种不同的编码,同样某一个编码也可能会有不同的名称。3、Python的字符串类型Python提供了字符类型在脚本中表示字符。在脚本中所使用的字符串类型取决于所使用的Python版本。Python2.X中:str表示8位文本和二进制数据;unicode表示宽字符Unicode文本。Python2.X中两种字符串类型是不同的(unicode支持编码和解码)。Python2.X中的str字符串类型可以用于8位表示的文本以及用绝对字节值表示的二进制数据。而在Python 3中:str表示Unicode文本(8位和更宽的),bytes表示二进制数据。bytearray是一种可变的bytes类型(因为我用的是Python 2.7,所以在此不做过多介绍)4、编码Unicode字符串Python的字符串常量支持“\xNN”十六进制字节值转义以及“\uNNNN”"\UNNNNNNNN"Unicode转义。在Unicode转义中,前者给出了4个十六进制值以编码一个2个字节字符码,后者给出8个十六进制值以编码一个4个字节字符码5、在Python2.X中编码Unicode字符串unicode在Python2.X中是可用的,但它与str是截然不同的类型,并且当常规字符串和Unicode字符串兼容的时候,它允许自由组合。为了存储任意的编码的Unicode文本,用u'xxx'常量形式创建一个unicode对象。一旦创建可以把Unicode文本转换为不同的原始字节编码。在Python2.X中,非ASCII字符可以用十六进制或Unicode转义来编写到字符串常量中。不过"\u..."和"\U..."转义只是识别为Unicode字符串,而不是8位str字符串。也就是说,"\u00C4"=="\xC4",这些转义都只是识别其为Unicode字符串,相当于是用这种形式在表示这个字符,真正区分其是unicode类型还是str类型的关键在于引号前是否有'u'。只要str和unicode的编码兼容,unicode和非unicode的str对象可以在表达式中自由混合,Python会自动将其转换为unicode对象。如果要在两者之间进行显式的转换,用str()和unicode()函数。Python2.X的open调用只支持8位字节的文件,将其内容返回为str字符串。将其内容解释为文本,还是解释为二进制数并根据需要解码,这取决于你。要读取和编写Unicode文件并进行自动编码和解码,使用codecs.open调用,其使用unicode对象来表示文件内容,读取一个文件,把编码的字节翻译为解码的Unicode字符,并且在文件打开的时候把翻译字符串写入想要指定的编码。6、源文件字符集编码声明对于在脚本中编码的字符串,Python默认使用ASCII编码,但是它允许我们通过包含一个注释来指明想要的编码,从而将默认值修改为支持任意的字符集。格式:#-*-coding:utf-8-*-当出现这个格式时,Python将自然按照给定的编码来识别表示的字符串。Python 2.X中默认编码为ASCII(通过sys.getdefaultencoding查看)7、使用文本文件和二进制文件文本模式的文件执行通用的行末转换,默认地所有的行末形式映射为脚本中的一个'\n'字符,而不管在什么平台上运行。二进制模式文件不会返回原始的文件内容,而是作为字节值的整数的一个序列,没有编码和解码,也没有行末转换。在Python2.X中文本文件和二进制文件没有主要区别,唯一的区别在于在Windows下文本文件会自动把\n行末字符和\r\n相互映射,而二进制文件不这么做。关于从文件中读取和写入非ASCII字符的理解:在Python 2.X中,用open()调用时,默认是只支持字节的字符,也就是说从其中读取出来的非ASCII字符是原始字节符(诸如:\xee\x4e....)。同样写入的时候也只能写入str类型对象。用codecs.open()调用时,若未指定编码,则和open()调用一样,若指定编码,则以指定编码打开文件。换句话说,如果以utf-8编码打开文件,则读出的字符是utf-8编码格式(\u4ef0....),同样以unicode类型对象来写入。关于Python 2.X中的unicode和str类型:简单来说,str可以认为是上面提到的原始字节符,是诸如“\xe3\x45....”这样的,单单用引号括起来的字符串就是str类型。Unicode是以某种编码表示的字符,在字符串的引号前面加上的'u'表示这是Unicode对象。Unicode对象通过encode()调用转换为str类型。str类型通过decode()调用转换为Unicode。encode和decode调用中指定编码,若未指定则为系统默认分编码(ascii)
了这篇文章
类别:┆阅读(0)┆评论(0)Python——str字符串和unicode字符串 - 东山客的博客 - CSDN博客
Python——str字符串和unicode字符串
编程语言Python
对于处理过中文的Python程序员来说,想必对UnicodeEncodeError和UnicodeDecodeError并不陌生。为了更好的理解Python中的编码问题,我们首先介绍一下字符编码以及Python的两种字符串类型:str和unicode之间的区别。
我们在编辑器中输入的文字,对用户来说是可读的。但是机器只能读懂01串,那怎么把我们方便阅读的符号转换成机器能读懂的01串呢?
这就需要给出符号-二进制之间的映射关系,而且必须是一一映射:即给定一个符号,机器有而且有唯一的二进制对应。根据字符得到二进制表示是编码过程(encode);根据二进制表示得到字符是解码过程(decode)。
ASCII字符集与字符编码
刚开始的时候,给出了ASCII标准,用一个8bits字节来表示字符。而且这个字节实际上只用了7位,最高位是不用的,这样总共能表示128个字符。意味着ASCII字符集只有128个。
随着计算机的普及,越来越多的国家开始使用计算机。128个字符难以满足各个国家的语言需求,这促使包含更多字符的字符集诞生,并且需要采用新的编码方案。
充分利用8bits字节的高位,扩展到256个字符。
Unicode字符集与字符编码
Unicode字符集包含了所有种语言的所有字符。通常用U+后接4位的16进制数字表示一个Unicode字符,比如U+FFFF。
UTF-8是针对Unicode字符集的一种编码方案。
用变长字节来表示字符:有的字符用一个字节表示(比如ASCII中规定的字符),有的字符用2个字节表示。最大长度为4字节。
上面这张图是从Wikipedia中截取的。Number of Bytes列表示字节数;Bits for code point列表示多少个bit位是真正有用的;First code point列表示该字节数能表示的第一个Unicode字符;Last code point列表示对应字节数能表示的最后一个Unicode字符;Byte i(i=1,2,3,4)列表示第i字节上的bit值。
以第二行为例,这一行的编码需要两个字节,其中真正有用的bit位只有11个,另5位是占位符,能表示从U+0080~U+07FF的Unicode字符。
至于具体的编码方式,我们以欧元符号EUR为例。EUR在Unicode字符集中对应U+20AC:
U+20AC位于U+0800~U+FFFF之间,所以需要三个字节来表示;
十六进制20AC可以写成二进制:0010 0000 1010 1100;
前4个bit放在第一字节的低4位:11100010;
中间6个bit放在第二字节的低6位:10000010;
后6个bit放在第三字节的低6位:10101100;
于是EUR的UTF-8编码为:00。
Unicode字符集还有其他的编码方式,这里就介绍到这里。
要记住:所有的编码方式都是向后兼容ASCII的。ASCII字符对应什么二进制,那么在其他编码方式中也对应同样的二进制。
Python的字符串类型
Python包含两种字符串类型:str(其实就是二进制)和unicode。当只会用到ASCII字符集时,一切相安无事。一旦出现其他字符集,问题也就接踵而来。所以下面我们着重介绍非ASCII字符串。
我们平时写的用引号括起来的字符串都是str类型的。
&&& x = '哈哈'
'\xb9\xfe\xb9\xfe'
根据上面的打印结果,可以知道str类型的x存的其实是二进制序列,而非字符串。为什么会出现这种情况呢?我们赋给x的明明是字符串。
其实很简单,x经过了一次隐形的编码过程encode()。应该采用的是系统默认编码方案。
- unicode类型
如果在引号的前面加上字符u,那么我们就得到一个unicode字符串:
&&& x = u'哈哈'
u'\u54c8\u54c8'
unicode对象保存的是字符串本身,而非二进制序列。比如程序中的unicode字符串中包含两个U+54c8字符。
unicode编码为str
但是有的时候,我们需要二进制序列,比如将数据写入文件、发送到网络或者写入数据库中时。如果不进行任何处理,会出现错误:
&&& x = u'哈哈'
u'\u54c8\u54c8'
&&& f = open('test.txt', 'w');
&&& f.write(x)
Traceback (most recent call last):
File "&stdin&", line 1, in &module&
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)
这是因为在把字符串写入文件时,会首先检查字符串的类型,如果是str类型的字符串,那么一切OK;如果是unicode类型的字符串,那么会隐式地对其编码,即x.encode()。而系统默认的编码方案是ASCII(可以通过sys.getdefaultencoding()查看),对非ASCII字符进行编码的时候,肯定会出现错误。
为了避免错误,在写入文件之前,应该用utf-8或者gbk编码方案对unicode字符串编码:
&&& x = u'哈哈'
u'\u54c8\u54c8'
&&& f = open('test.txt', 'w');
&&& x = x.encode('utf-8')
'\xe5\x93\x88\xe5\x93\x88'
&&& f.write(x)
str解码为unicode
当从文本中读取数据时,读到的是str字符串,而且我们已经知道,它保存的是二进制序列。如果其中包含非ASCII文本,我们应该怎么恢复呢?这时候就要用到解码decode()。
&&& f = open('test.txt', 'w');
&&& x = f.read()
'\xe5\x93\x88\xe5\x93\x88'
&&& x = x.decode('utf-8')
u'\u54c8\u54c8'
一定要记得,用什么方式编码的就必须用什么方式解码。不然的话,从二进制到字符的对应过程会出现UnicodeDecodeError。
print语句的参数需要是str类型,而且在执行的时候会用系统的编码方式对str进行隐式解码。
两个遗留问题
#-*-coding:utf-8 -*-
现在暂且认为如果脚本中包含中文,那么必须加上这个声明。
setdefaultencoding()
这个方法貌似现在不可以用了。我觉得这个设置与encode()、decode()在不指明参数的情况下的默认参数有关。
我的热门文章
即使是一小步也想与你分享

我要回帖

更多关于 python3 str转bytes 的文章

 

随机推荐