|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 大马强 于 2021-8-19 17:45 编辑
最近在做爬网易云评论获取那两参数时接触到的,查了点资料结合自己的理解分享给各位鱼油
由于是偏新手向的理解,如有不对的欢迎指出
一、什么是 str 和 bytes
1.str 字符串 一堆经过计算机处理的01001二进制比特流,给人看的
2.bytes 字节串 以二进制形式存放在计算机中的比特流,给计算机看的
对于一些英文字符只要是在ascii码表上,它们显示都是一样的,唯一区别是前边有个 b 做前缀,而汉字字符则以16进制形式显示。(修改:二者公用ascii表)
二、两者的转换
1.str -> bytes : str.encode(encoding), bytes(str, encoding)
字符串通过编码变为字节串,通过字符串的encode方法,一般常用的编码格式utf-8,gbk,默认编码的格式为utf-8
还有通过内置函数bytes(str, encoding)
2.bytes -> str : bytes.decode(decoding), str(bytes, decoding)
字节串通过解码变为字符串,通过字节串的decode方法,一般常用的解码格式utf-8,gbk,默认解码的格式为utf-8
还有通过内置函数str(bytes, encoding)
用utf-8编码和gbk编码得到的字节串是不一样的,在utf-8中一个汉字占3个字节,而在gbk中才占两个字节,bytes()在处理字符串是encoding是不能省的
对于汉字来说,编码时候用什么是格式,解码也一定要用什么格式,如果使用str来解码, encoding一定要写
三、两者转换的代码案例
- # 创建三个类型的字符串,并且打印
- a1 = "马强"
- a2 = "maqiang"
- a3 = "123@#"
- print(type(a1), a1)
- print(type(a2), a2)
- print(type(a3), a3)
- """
- 输出
- <class 'str'> 马强
- <class 'str'> maqiang
- <class 'str'> 123@#
- """
- # 将其转变为字节串
- b1 = a1.encode() # bytes(a1,"utf-8")
- b2 = a2.encode() # bytes(a2,"utf-8")
- b3 = a3.encode("gbk") # bytes(a3,"utf-8")
- # 用bytes转换encoding不能省
- print(type(b1), b1)
- print(type(b2), b2)
- print(type(b3), b3)
- """
- 输出
- <class 'bytes'> b'\xe9\xa9\xac\xe5\xbc\xba'
- <class 'bytes'> b'maqiang'
- <class 'bytes'> b'123@#'
- """
- # 将其转变回字符串
- c1 = str(b1, "utf-8") # b1.decode("utf-8") , encoding 一定要加 且与编码时相同
- c2 = str(b2, "utf-8") # b2.decode("utf-8")
- c3 = str(b3, "utf-8") # b3.decode("utf-8") encoding 一定要加 且可以与编码时不相同
- print("c1", type(c1), c1)
- print("c2", type(c2), c2)
- print("c3", type(c3), c3)
- """
- 输出1 - 加都加encoding
- c1 <class 'str'> 马强
- c2 <class 'str'> maqiang
- c3 <class 'str'> 123@#
- 输出2 - 都不加 encoding
- c1 <class 'str'> b'\xe9\xa9\xac\xe5\xbc\xba'
- c2 <class 'str'> b'maqiang'
- c3 <class 'str'> b'123@#'
- """
复制代码
四、其他补充
1.两者的内置方法几乎一样,不同的是str有encode,bytes有的decode,所以下面是我进行拼接操作得出的结果
- print(a1+a2) # 同str
- print(a1+b2) # 不同
- print(b1+b2) # 同bytes
- print(b1+b3) # 不同编码
- """
- 输出
- 马强maqiang
- 报错 can only concatenate str (not "bytes") to str
- b'\xe9\xa9\xac\xe5\xbc\xbamaqiang'
- b'\xe9\xa9\xac\xe5\xbc\xba123@#'
- """
复制代码
2.bytes()这个内置函数不能对浮点数经行操作,编码整数时不能添加encoding参数
五、学习中,待补充和完善 |
|