python中unicode编码解码介绍,解决各种编码类错误
⼀、编码的种种问题
背景: 使⽤linux开发环境,scureCRT客户端;想使⽤utf-8编码
1. 程序⽂件编码
就是你的程序⽂本⽂件保存时选取的编码,通过 file -i test_encoding.py 来查看
如果不是UTF-8,假设是GBK,可以使⽤命令 iconv -f GBK -t utf-8 test_encode.py > tmp; mv tmp test_encode.py
2. 系统环境编码
对系统环境编码的设置,locale命令来查看
如果不是可以使⽤命令 export LANG="zh_CN.utf-8"; export LC_CTYPE="zh_CN.utf-8" 来设置本次会话的编码;如果想⼀劳永逸,那
还是打开 ~/.bashrc 把那两条命令射进去,然后 soure ~/.bashrc ⼀下。
3. scureCRT终端编码
选项=> 会话选项 => 终端 => 仿真 ,按照此路径在scureCRT客户端中展开,在右侧终端(T)的列表中选择linux
选项=> 会话选项 => 终端 => 外观,按照此路径到内容,在右侧字符编码(H)的列表中选择UTF-8
只有这三种编码都保持⼀致了,才基本可以保证中⽂编码不会乱
4. python 程序中的编码
按照1-3设置好以后,在test_encode.py中来⼀段python编码
import sys
lvchabiao="绿茶婊"
print lvchabiao
print type(lvchabiao)
print repr(lvchabiao)
执⾏: pythyon test_encode.py
看⼀下提⽰,错误出在第2⾏,也就是有中⽂的那⾏,这是因为python 解释器默认按照ascii码来解释,我们需要在python
程序的第⼀条语句处(该语句之前不能有任何语句),加上#-*-coding=utf-8-*- , 它告诉python解释器,该⽂件的内容按照utf-8编码来解释
#-*-coding=utf-8-*-
import sys
lvchabiao="绿茶婊"
print lvchabiao
print type(lvchabiao)
print len(lvchabiao)
print repr(lvchabiao)
⼆、python程序中的编码以及python程序与⽂件的编码交互
执⾏上⾯的程序,得到上图的结果;其中变量的类型为str, 长度为9,结合utf-8编码表⽰中⽂的时候是⽤3个字节,那么“绿茶婊”这个值就占⽤了9个字节,因此我们知道str类型存储的是字节序列。接下来让我们看看编码转换
1. 编码转换
再累计⼀段代码:
#utf-8 转 unicode
u = lvchabiao.decode('utf-8')
print u
print type(u)
print len(u)
print repr(u)
执⾏⼀下,会看到新增代码输出如下:
我们看到变量值的长度输出为3,即字符的个数,每个字符⽤2个字节编码(4个16进制的数值)
2. 编码与输出
我们执⾏python test_encode.py 输出到标准输出,没有问题;然后,执⾏python test_encode.py > tmp 却报错了,如下:
错误显⽰在执⾏ " print u " 这个语句的时候⽆法按照ascii码来编码u这个变量(unicode编码),原因在于我们把结果输出到⽂件中的时候是按照字节流的⽅式,⽽unicode不是字节流的⽅式,我们需要把unicode编码编码为字节流格式的编码;python默认采⽤ascii编码,当⽤ascii编码去编码汉字的时候,⽆法表达这就出错了。因此,当我们要把unicode输出到⽂件之间,需要做编码转换,即将unicode编码编码为⽂件编码,程序修改为
de("utf-8")
3. unicode字⾯变量转为unicode对象
在python程序中,python2.x 中,我们可以通过在字符串前⾯显⽰的加上⼀个u,来说明这个字符串是⼀个unicode编码的值;然⽽,当我们获得⼀份⽂件,⽂件中的内容为unicode编码的字⾯变量的时候,我们如何把这些字符串转成unicode变量呢?
例如:
unicode码和ascii码区别u_value=u"\u7eff\u8336\u5a4a"
print u_value
str_value = "\u7eff\u8336\u5a4a"#从⽂件获得
print str_value.decode("raw_unicode_escape")
4. 设计json解析的时候,如何处理编码
编码在数据格式转换中不是对称的
python数据 转 json的规则: str, unicode => string
json数据 转python的规则:string => unicode
所以,当我们⽤json 的load函数解析出json数据,往⽂件中存储之前,需要⽤ de("target_coding") 将数据转成想要的字符编码.
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论