龙空技术网

也谈python字符串编码(理解后再也没难度)

真莱斯 93

前言:

目前姐妹们对“escape转码”大体比较看重,大家都需要知道一些“escape转码”的相关文章。那么小编也在网摘上网罗了一些关于“escape转码””的相关资讯,希望大家能喜欢,大家快快来了解一下吧!

Python2的字符串设计的太复杂了。Python3对字符串进行了简化。

但是这种简化,也是有一定难度的。根本的原因不是Python设计不合理(当然Python2是有点那啥),而是字符本身是比较复杂的。不然也不会有计算机刚进入中国时候的汉卡这一设备了。想了解这段历史的,建议去西瓜视频看一下“段奕宏”主演的《大时代》,一个汉卡1500,记住是80年代末的1500元。那个时候我记得冰砖1毛钱一块。

那么,我们到底怎么去理解python3中的字符串呢?

我们理一下,这三个关系就好了。如图:

str类型特点:

1.所有的文字类型都是unicode类型,前面加不加u都一样。"xx"==u"xx",python3中是True

2.所有的源代码文件,默认都是utf8编码的

3.所有的str数据类型使用print方法打印,前面什么标识都没有; type方法打印出来的是<class 'str'>

4.str类型需要传输和保存是需要进行编码的,encode()

bytes类型特点:

1.所有的bytes数据类型使用print方法打印,前面有b,如b"xx"; type方法打印出来的是<class 'bytes'>

2.bytes形式要转换成str形式,在python中再使用。使用decode()。

3.bytes要转换成bytearray,需要使用bytearray的构造函数形式:bytearray(b"abc")

bytearray类型特点:

1.bytearray是bytes的字节序列,相当于是bytes的可变版本。

2.所有的bytearray数据类型使用print方法打印,前面有bytearray,如bytearray("xx"); type方法打印出来的是<class 'bytearray'>

3.bytearray要转换程bytes,需要使用bytes的构造函数形式:bytes(bytearray(b'ABCDE'))

总之记住:

1. 平常使用str(Python代码间的交互使用)。

2. 保存到xxx和读取自xxx,这些通过第三方媒介收集来的内容都是bytes,需要转码。

3. bytearray:一般用不到,只有再需要对bytes进行修改的时候,才有必要去使用。

4.str和bytes都是不可变类型。同样的值,对应的id一样(也就是内存上是同一个地址)

很多人会说,你讲的我的知道;但是遇到乱码问题还是不会,抓瞎,怎么办?

因为你遇到乱码的机会比较少,经验不足,遇到一个就很纠结。很幸运,我踩过不少坑,你们不用踩了。看完下面的处理实例,你就再也没有,不会的字符串编解码了。

还解不了的,三种可能:1.本身就是乱码,存的时候就错了;2:存储文件的时候,没有按照规定的格式存储,导致读出异常;或者是传输协议中在申明字符类型的时候,没有申明或者是申明错误,3.再有异种系统,解析的时候没有注意字节顺序(这个在后续的介绍struct模块的时候讲解)。

Part1:对于str类型的异常处理:

1. 在字符串类型中遇到的都是16进制怎么办?

首先发现一个数据类型是字符串,里面的都是16进制。是错误的。

我们可以通过chardet(pip3 install chardet)这个模块去猜测他是什么类型,然后按照它给的建议去解析。

2. 在字符串中遇到有反斜杠的x,怎么办?

首先发现一个数据类型是字符串,但是里面有\x。这个\x应该是出现在b”xx”,bytes类型中的。所以要将这个字符串原样转换成bytes类型就好了。

text = text.encode('unicode-escape')

codecs.escape_decode(text)

3. 在字符串中遇到有两个反斜杠的u,怎么办?

首先发现一个数据类型是字符串,但是里面有\u。

su.encode("utf-8").decode('unicode-escape')

4. 在字符串中遇到有一个反斜杠的u,怎么办?

恭喜你,这个不是问题,python3天生支持unicode,直接打印或者使用就好了。

Part2:对于bytes类型的异常处理:

假设存在一个bytes的变量,想查看是它的str类型的值是什么。

这个里面没有什么好的方法,使用chardet看下有没有好的建议去猜测是什么类型。没有的话也就只能强制转换了。

好在如果是中文的话,编码格式常用的是只有3种:

中国大陆简体:GB18030,GBK,GB2312;这一类使用GB18030这个是最新格式的解码。

中国台湾繁体:BIG5;又称大五码,这个是港澳台地区的编码。

万国码:Unicode

常用的存储文件格式也就3种:

1.ANSI编码(在cmd中,chcp就可以查到操作系统默认编码:936对应GBK)

2.字节顺序有关的存贮格式[unicodeBigEdition(str.encode("utf_16_be"), unicodeLittlerEdition(str.encode("utf_16_be"]

3.字节顺序无关的UTF8。

UnicodeBigEditon、UnicodeLittlerEdition、UTF-8文件都有特定的BOM来标识。

注意:chcp命令见:

sb.decode('GBK', errors='strict')

errors -- 可选参数,设置不同错误的处理方案。

默认为 'strict',意为编码错误引起一个UnicodeError。

其他可能得值有 'ignore', 'replace', 'xmlcharrefreplace', 'backslashreplace',

以及通过 codecs.register_error() 注册的任何值。

好了,现在编码对你,应该没有难度了。

标签: #escape转码 #python str 编码