【转载】RobotFramework编码详解-解决乱码问题Robot Framework编码详解-解决乱码问题
数字转unicode编码作者:brucepk
来源:(见下⽅)
今天给⼤家讲下robotframework框架中unicode编码或者是问号乱码的问题
⼤家看下⾯这个⼩栗⼦
这就涉及到了计算机的编码问题
因为计算机只能处理数字,如果要处理⽂本,就必须先把⽂本转换为数字才能处理。最早的计算机在设计时采⽤8个⽐特(bit)作为⼀个字节(byte),所以,⼀个字节能表⽰的最⼤的整数就是255(⼆进制11111111=⼗进制255),如果要表⽰更⼤的整数,就必须⽤更多的字节。⽐如两个字节可以表⽰的最⼤整数是65535,4个字节可以表⽰的最⼤整数是4294967295。
由于计算机是美国⼈发明的,因此,最早只有127个字符被编码到计算机⾥,也就是⼤⼩写英⽂字母、数字和⼀些符号,这个编码表被称为ASCII编码,⽐如⼤写字母A的编码是65,⼩写字母z的编码是122。
但是要处理中⽂显然⼀个字节是不够的,⾄少需要两个字节,⽽且还不能和ASCII编码冲突,所以,中国制定了GB2312编码,⽤来把中⽂编进去。
你可以想得到的是,全世界有上百种语⾔,⽇本把⽇⽂编到Shift_JIS⾥,韩国把韩⽂编到Euc-kr⾥,各国有各国的标准,就会不可避免地出现冲突,结果就是,在多语⾔混合的⽂本中,显⽰出来会有乱码。
因此,Unicode应运⽽⽣。Unicode把所有语⾔都统⼀到⼀套编码⾥,这样就不会再有乱码问题了。
Unicode标准也在不断发展,但最常⽤的是⽤两个字节表⽰⼀个字符(如果要⽤到⾮常偏僻的字符,就需要4个字节)。现代操作系统和⼤多数编程语⾔都直接⽀持Unicode。
现在,捋⼀捋ASCII编码和Unicode编码的区别:ASCII编码是1个字节,⽽Unicode编码通常是2个字节。
字母A⽤ASCII编码是⼗进制的65,⼆进制的01000001;
字符0⽤ASCII编码是⼗进制的48,⼆进制的00110000,注意字符'0'和整数0是不同的;
汉字中已经超出了ASCII编码的范围,⽤Unicode编码是⼗进制的20013,⼆进制的0100111000101101。
你可以猜测,如果把ASCII编码的A⽤Unicode编码,只需要在前⾯补0就可以,因此,A的Unicode编码是0000000001000001。
新的问题⼜出现了:如果统⼀成Unicode编码,乱码问题从此消失了。但是,如果你写的⽂本基本上全部是英⽂的话,⽤Unicode编码⽐ASCII编码需要多⼀倍的存储空间,在存储和传输上就⼗分不划算。
所以,本着节约的精神,⼜出现了把Unicode编码转化为“可变长编码”的UTF-8编码。UTF-8编码把⼀个Unicode字符根据不同的数字⼤⼩编码成1-6个字节,常⽤的英⽂字母被编码成1个字节,汉字通常是3个字节,只有很⽣僻的字符才会被编码成4-6个字节。如果你要传输的⽂本包含⼤量英⽂字符,⽤UTF-8编码就能节省空间:
UTF-8编码有⼀个额外的好处,就是ASCII编码实际上可以被看成是UTF-8编码的⼀部分,所以,⼤量只⽀持ASCII编码的历史遗留软件可以在UTF-8编码下继续⼯作。
搞清楚了ASCII、Unicode和UTF-8的关系,我们就可以总结⼀下现在计算机系统通⽤的字符编码⼯作⽅式。
在计算机内存中,统⼀使⽤Unicode编码,当需要保存到硬盘或者需要传输的时候,就转换为UTF-8编码。
⽤记事本编辑的时候,从⽂件读取的UTF-8字符被转换为Unicode字符到内存⾥,编辑完成后,保存的时候再把Unicode转换为UTF-8保存到⽂件。
浏览⽹页的时候,服务器会把动态⽣成的Unicode内容转换为UTF-8再传输到浏览器。
所以你看到很多⽹页的源码上会有类似<meta charset="UTF-8" />的信息,表⽰该⽹页正是⽤的UTF-8编码。
弄清楚了这个编码问题之后,我们再来看⼀下如何解决robotframework框架unicode的问题
⾸先,看下我的安装环境,我的robotframework版本是3.0.x的
到robotframework安装⽬录下的unic.py⽂件,我的⽬录是C:\Python27\Lib\site-packages\robotframework-3.0.\robot\utils,在unic.py⽂件中插⼊
if isinstance(item, (list, dict,tuple)):
try:
item= json.dumps(item, ensure_ascii=False, encoding='utf-8')
exceptUnicodeDecodeError:
try:
item= json.dumps(item, ensure_ascii=False, encoding='utf-8')
except:
pass
except:
pass
加完这⼀段代码之后,保存,然后重启ride编辑器,再运⾏⼀下刚才的脚本,现实中⽂正常了!
如果你的还是显⽰不正常,请继续往下看,我们来看⼀下是不是python默认的编码⽅式导致的
cmd命令下通过以下命令查看python默认的编码
python
import sys
这时看到,python的默认编码⽅式是ascii编码⽅式,这时我们将它改成utf8
在Python的Lib\site-packages⽂件夹下新建⼀个sitecustomize.py⽂件,内容为:
#coding=utf8
import sys
reload(sys)
sys.setdefaultencoding('utf8')
重启Python解释器,发现编码已被设置为utf8
这样,乱码问题就完美解决!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论