API自动化测试

python中转换模块codecs

2020-01-08  本文已影响0人  Jeff_9021

0、编码

编码转换时,通常需要以unicode作为中间编码,即先将其他编码的字符串解码(decode)成unicode,再从unicode编码(encode)成另一种编码。

str1.decode('gb2312')    #将gb2312编码的字符串转换成unicode编码

str2.encode('gb2312')    #将unicode编码的字符串转换成gb2312编码

注意事项:

s=‘中文’ 如果是在utf8的文件中,该字符串就是utf8编码,如果是在gb2312的文件中,则其编码为gb2312。这种情况下,要进行编码转换,都需要先用decode方法将其转换成unicode编码,再使用encode方法将其转换成其他编码。

在没有指定特定的编码方式时,都是使用的系统默认编码创建的代码文件。

如果字符串是这样定义: s=u’中文’ 则该字符串的编码就被指定为unicode了,即python的内部编码,而与代码文件本身的编码无关。只需要直接使用encode方法将其转换成指定编码即可

如果一个字符串已经是unicode了,再进行解码则将出错,因此通常要对其编码方式是否为unicode进行判断isinstance(s, unicode) #用来判断是否为unicode

1、查看编码方式

(1)对于我们经常使用的记事本,“文件” -> “另存为”,可查看到当前的编码方式。

(2)用notepad++打开,点击“菜单栏” -> “格式”可以查看到。

(3)UltraEdit:

不同编码的文本,是根据文本的前两个字节来定义其编码格式的,定义如下:

ANSI:        无格式定义;

Unicode:       前两个字节为FFFE;

Unicode big endian: 前两字节为FEFF;

UTF-8:        前两字节为EFBB;

这样通过前面两个字节就可以判定出文件的具体格式了。

2、python编码

当python要做编码转换的时候,会借助于内部的编码,转换过程是这样的:

原有编码 -> 内部编码 -> 目的编码

python的内部是使用unicode来处理的,但是unicode的使用需要考虑的是它的编码格式有两种,一是UCS-2,它一共有65536个码位,另一种是UCS-4,它有2147483648g个码位。

判断安装的python是用什么编码方式:

import sys

print(sys.maxunicode)

如果输出的值为65535,那么就是UCS-2,如果输出是1114111就是UCS-4编码。

转换成内部码:

c = "风卷残云"

print(type(c))

c = bytes(c,encoding='utf-8')

print(type(c))

print(c)

b = codecs.decode(c, "utf-8") #与c.decode()等效

print(type(b))

print(b)

print(c.decode())

输出:

<class'str'>

<class'bytes'>

b'\xe9\xa3\x8e\xe5\x8d\xb7\xe6\xae\x8b\xe4\xba\x91'

<class'str'>

风卷残云

风卷残云

3、codecs模块

codecs专门用作编码转换。通过它的接口是可以扩展到其他关于代码方面的转换。

在python3.x中可以直接将bytes类型的数据转换成其他编码格式,而不用手动先转成unicode。

import codecs

a = "我爱你"

 # 创建utf-8编码器

look = codecs.lookup('utf-8')

type(a)

a = bytes(a,encoding='utf-8')

b = look.decode(a)

print(b)

输出:

('我爱你', 9)

返回的元组中b[0]是数据,b[1]是长度。

** 用codecs提供的open方法来指定打开的文件的语言编码,它会在读取的时候自动转换为内部unicode**

f = codecs.open(filepath, 'r', 'utf8')

读取方式有很多种,这里的f是可以用for循环遍历的,当然也可以直接用readline或者readlines函数方法来读取。

#fori in f:

#    print(i)

#f.readline()

#f.read()

#f.readlines()

python代码文件的编码

py文件默认是ASCII编码,中文在显示时会做一个ASCII到系统默认编码的转换,这时就会出错:SyntaxError: Non-ASCII character。需要在代码文件的第一行或第二行添加编码指示:

# coding=utf-8 #                                 #以utf-8编码储存中文字符

print '中文'像上面那样直接输入的字符串是按照代码文件的编码来处理的,如果用unicode编码,有以下2种方式:

s1 = u'中文' #u表示用unicode编码方式储存信息

s2 = unicode('中文','gbk')

unicode是一个内置函数,第二个参数指示源字符串的编码格式。

decode是任何字符串具有的方法,将字符串转换成unicode格式,参数指示源字符串的编码格式。

encode也是任何字符串具有的方法,将字符串转换成参数指定的格式

python字符串的编码

用 u'汉字' 构造出来的是unicode类型,不用的话构造出来是str类型

str的编码是与系统环境相关的,一般就是sys.getfilesystemencoding()得到的值

所以从unicode转str,要用encode方法

从str转unicode,所以要用decode

例如:

# coding=utf-8  #默认编码格式为utf-8

s = u'中文' #unicode编码的文字

print s.encode('utf-8')  #转换成utf-8格式输出

print s #效果与上面相同,似乎默认直接转换为指定编码

我的总结:

u=u'unicode编码文字'

g=u.encode('gbk') #转换为gbk格式

print g #此时为乱码,因为当前环境为utf-8,gbk编码文字为乱码

str=g.decode('gbk').encode('utf-8')  #以gbk编码格式读取g(因为他就是gbk编码的)并转换为utf-8格式输出

print str #正常显示中文

安全的方法:

s.decode('gbk','ignore').encode('utf-8′) #以gbk编码读取(当然是读取gbk编码格式的文字了)并忽略错误的编码,转换成utf-8编码输出

因为decode的函数原型是decode([encoding], [errors='strict']),可以用第二个参数控制错误处理的策略,默认的参数就是strict,代表遇到非法字符时抛出异常;

如果设置为ignore,则会忽略非法字符; 

如果设置为replace,则会用?取代非法字符; 

如果设置为xmlcharrefreplace,则使用XML的字符引用。

Unicode为世界上所有字符都分配了一个唯一的数字编号,这个编号范围从 0x000000 到 0x10FFFF(十六进制),有110多万,每个字符都有一个唯一的Unicode编号,这个编号一般写成16进制,在前面加上U+。例如:“马”的Unicode是U+9A6C。

它是一种规定,Unicode本身只规定了每个字符的数字编号是多少,并没有规定这个编号如何存储。

主要有UTF-8,UTF-16,UTF-32。

简单来说,unicode,gbk和大五码就是编码的值,而utf-8,uft-16之类就是这个值的表现形式.而前面那三种编码是一兼容的,同一个汉字,那三个码值是完全不一样的.如"汉"的uncode值与gbk就是不一样的,假设uncode为a040,gbk为b030,而uft-8码,就是把那个值表现的形式.utf-8码完全只针对uncode来组织的,如果GBK要转UTF-8必须先转uncode码,再转utf-8就OK了.

上一篇下一篇

猜你喜欢

热点阅读