区分 bytes str 和 unicode
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了区分 bytes str 和 unicode相关的知识,希望对你有一定的参考价值。
参考技术A Python3 有两种表示字符序列的类型: bytes 和 str 。其中 bytes 是一种包含原始8位值的序列; str 是一种包含 Unicode 字符的序列。
Python2 也有两种表示字符序列的类型: str 和 unicode 。其中 str 是一种包含原始8位值的序列; unicode 是一种包含 Unicode 字符的序列。
把 Unicode 字符转换成二进制数据(原始8位值)有多种办法,最常见的编码方式就是 UTF-8。Python3 的 str 实例或者 Python2 的 unicode 实例表示的 Unicode 字符要想转换成二进制数据,必须使用 encode 方法;要想把二进制数据转换成 Unicode 字符,则必须使用 decode 方法。
编码和解码操作我们通常会放在最外围来做,程序的核心部分应该使用 Unicode 字符类型,即 Python3 中的 str 和 Python2 中的 unicode ,并且不要对字符编码做任何假设。因此,在对输入的数据进行操作之前,我们通常会在应用中定义好辅助函数,以保证字符序列的类型符合以下预期:
下面,我们针对 Python2 和 Python3 ,分别编写 2 个辅助函数,以便在两种情况之间转换,确保转换后的输入数据符合预期的字符序列类型。
接受 str 或 bytes ,确保返回 str 的辅助函数:
运行结果:
接受 str 或 bytes ,确保返回 bytes 的辅助函数:
运行结果:
接受 str 或 unicode ,确保返回 unicode 的辅助函数:
Python2 中的 str 在程序中均以原始的 8 位值表示:
下面的写法,使用 format 函数连接 2 个字符序列,返回新的 str 是没问题的:
可若要返回 unicode 字符序列,则会报 UnicodeDecodeError :
这个时候我们就需要上述编写的 to_unicode 辅助函数,把 var2 转变为 unicode 序列:
接受 str 或 unicode ,确保返回 str 的辅助函数:
定义一个 unicode 字符序列:
使用 format 函数连接 2 个字符序列,返回 unicode 字符序列:
同理,返回 str ,则会报 UnicodeEncodeError :
我们需要借助上述编写的辅助函数 to_str 将 var3 转换为字节序列:
Python bytes与str
bytes与str概念
bytes是一种比特流,以0101这种形式存在,它是计算机能够读懂的格式,str是unicode的呈现形式。
Python 3最重要的新特性之一是对字符串和二进制数据流做了明确的区分。文本总是Unicode,由str类型表示,二进制数据则由bytes类型表示。Python 3不会以任意隐式的方式混用str和bytes,你不能拼接字符串和字节流,也无法在字节流里搜索字符串(反之亦然),也不能将字符串传入参数为字节流的函数(反之亦然)。
str 与 bytes转换
name = '阿林'
print(name)
print(name.encode()) #执行结果:b'\\xe9\\x98\\xbf\\xe6\\x9e\\x97'
name_1 = b'\\xe9\\x98\\xbf\\xe6\\x9e\\x97'
print(name_1.decode()) #执行结果:阿林
以上是关于区分 bytes str 和 unicode的主要内容,如果未能解决你的问题,请参考以下文章
Python3中内置类型bytes和str用法及byte和string之间各种编码转换