Python和C的字符串

在Python 3 中,bytes单独作为一个类型,不再和str类型混在一起。关于字符串和字节,我想先回顾下C/C++

在C/C++中,字符串是由char数组构成,每个元素是一个Char数据结构,数组的结尾是'\0'空字符。

  1. char是默认的unsigned的整型数据, 用于存储英文字符和小的整数(取值是0-255)。
  2. ASCII是char的子集,因此char很好存储英文字母, 满足存储英文字符的需求。

在C/C++中,int是整型的数据结构。而Python的int被设计成类,它有自己的属性和方法。这是Python和C/C++截然不同的地方。

同样在C/C++中的char整型,到了Python中,相应的是bytes类。我们可以这样说:Python中的Bytes类,本质上是C/C++中的char数组。

如下是几个demo。

1. 对比bytes和string

对于字节:

my_bytes = b'Python'
print(type(my_bytes))
print(my_bytes[0])
print(my_bytes[0] + 1) # 结果:
<class 'bytes'>
80
81

对于字符串:

my_string = 'Python'
print(type(my_string))
print(my_string[0])
print(my_string[0] + 'y') # 结果:
<class 'str'>
P
Py

结论:

  1. 在Python中,bytes和string都是序列类型,它们允许分片操作。
  2. 但是bytes中的+号是运算符,而string中+号是连接符。

从这个意义上,Python仍然保持着与C的一致性。在C中,bytes是char数组,string是以空字符结尾的char数组。+号对于前者是运算,对于后者是连接。

2. 如何用bytes表示125-255的整数型

a_num = b'\xff'
print(type(a_num[0]))
print(a_num[0]) # 结果:
<class 'int'>
255

结论:bytes类是序列,其中每个元素都是int类

字符串----encode--> 转到特定编码的的字节, 字节------decode--> 原生的字符串

字符串有decode方法,而字节是有encode方法。

3.关于decode和encode

str对象有encode方法,而bytes对象有decode方法,如何理解呢?

字符串(以某种编码存储的)----encode--> 转成特定编码的的字节,

字节(被编码的字节)------decode--> 原生的字符串。

name = '你好'                         # 此时"你好"是UTF-8编码存储的字符串
nameBytes = name.encode('utf-16') # 字节
nameStr = nameBytes.decode('utf-16') # 字符串
print(name)
print(nameBytes[0], nameBytes[1], nameBytes[2])
print(nameStr) # 结果:
你好
255 254 96
你好
  1. UTF-8编码的字节序列,总是以0xEF 0xBB开头,所以打印前两位出来是的:228,189
  2. UTF-16编码的字节序列,总是以0xEF 0xBB开头,所以打印前两位出来是的:255,254

因为一种格式编码的字符串可以被转换成其它的编码,所谓encode,本质就是编码的转换。python3中字符串默认是UTF-8编码格式,你可以把它encode成其它格式进行存储,当然,如果你要读取它,必须要以相应的编码格式去解码。

做个游戏

name = '你好'
nameBytes = name.encode('utf-8') # 字节
nameStr = nameBytes.decode('utf-16') # 字符串
print(name)
print(nameBytes[0], nameBytes[1], nameBytes[2])
print(nameStr) # 结果:
你好
228 189 160
뷤붥

我把中文“你好”用utf-8编码,然后用utf-16去解码,得到韩文--- 뷤붥

Python的bytes和str的更多相关文章

  1. python中bytes和str

    1.python中bytes和str Python3 最重要的新特性大概要算是对文本(text)和二进制数据(binary data)作了更为清晰的区分 (1)Python 3.0使用文本和(二进制) ...

  2. 浅析Python中bytes和str区别

    本博转载自:Chown-Jane-Y的浅析Python3中的bytes和str类型 Python 3最重要的新特性之一是对字符串和二进制数据流做了明确的区分.文本总是Unicode,由str类型表示, ...

  3. Python 3中的str和bytes类型

    Python3 中的str和bytes类型 Python3最重要的新特性之一是:对字符串和二进制数据流做了明确的区分.文本总是Unicode,由str类型表示,二进制数据则由bytes类型表示.Pyt ...

  4. python编程之字符bytes转换str问题

    之前学习bytes转换str的时候,场景比较简单,这次是python中使用subprocess模块输出Linux下的执行命令的结果,默认是bytes类型,因此输出的结果并不是我们想要的,bytes的输 ...

  5. python的str,unicode对象的encode和decode方法, Python中字符编码的总结和对比bytes和str

    python_2.x_unicode_to_str.py a = u"中文字符"; a.encode("GBK"); #打印: '\xd6\xd0\xce\xc ...

  6. Effective Python(3)- 了解 bytes 与 str 的区别

    Python 有两种类型可以表示字符序列 bytes:实例包含的是原始数据,即 8 位的无符号值(通常按照 ASCII 编码标准来显示) str:实例包含的是 Unicode 码点(code poin ...

  7. python bytes和str之间的转换

    1 # bytes object 2 b = b"example" 3 4 # str object 5 s = "example" 6 7 # str to ...

  8. python中bytes类型转换为str类型

    使用的原因:基于URL解析报文的时候,要使用str类型,但是提供的确实bytes类型,报错: TypeError: must be str, not bytes 所以就把bytes类型转换为str类型 ...

  9. #utf-8与gbk转换 #bytes 和str 的转换

    #!/user/bin/env python # -*- coding:utf-8 -*- temp = "连接" temp_unicode = temp.decode('utf- ...

随机推荐

  1. t6_sumdoc

    C:\Users\Administrator\Documents\sumdoc 2019\sumdoc t6 final\sumdoc t615C:\Users\Administrator\Docum ...

  2. js比较时间大于6个月

    //mons是比较的月数,如 2019-02-01 14:27:08 - 2019-08-01 14:27:08 function compareTime(mons,stTime,endTime){ ...

  3. (mysql)找不到请求的.Net Framework Data Provider。可能没有安装

    webconfig配置以下节点(注意版本号) 将下面代码放在machine.config中文件,如何Web.config文件没有配置,需要添加 <system.data> <DbPr ...

  4. GenTree:基因进化和功能分析

    欢迎来到"bio生物信息"的世界 GenTree是一个集合多种数据的在线数据库. 总共涉及的基因有63152个,蛋白质编码基因有20300个. 评估基因年龄用的是UCSC数据库的1 ...

  5. c# 导出excel的三种方式

    第一种:流导出 SaveFileDialog exe = new SaveFileDialog(); exe.Filter = "Execl files (*.xls)|*.xls" ...

  6. 搭建FTP(win10版)以及基本FTP操作

    参考链接:https://www.jianshu.com/p/ece21421e246 一.FTP服务器搭建 控制面板 - 程序和功能 - 启动或关闭Windows功能 启动以下功能: 搜索 “Int ...

  7. php提供一维数组模糊查询

    2019年9月30日14:36:15 提供一维数组模糊查询,只支持utf-8 内部处理是Unicode 编码特殊编码格式的可能会出错 if (!function_exists('arrayFuzzyQ ...

  8. elk配置路径

    elk/usr/local/etc/elasticsearch-6.5.1/usr/local/Cellar/logstash/6.5.1/./logstash -f/usr/local/Cellar ...

  9. Re库入门

    1. 正则表达式语法由字符和操作符构成 . 表示任何单个字符   [] 字符集,对单个字符给出取值范围 [abc]表示a.b.c,[a - z]表示a到z单个字符 [^] 非字符集,对单个字符给出排除 ...

  10. redis的redisvCommand的%b

    如下代码,向redis发送命令 SendCommand("HSET %b %b %b",key.data(),key.size(),filed.data(),filed.size( ...