6条回答 默认 最新
- 小码蚁啊 2018-01-24 07:33关注
一、编码的种种问题
背景: 使用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 syslvchabiao="绿茶婊"
print lvchabiao
print type(lvchabiao)
print repr(lvchabiao)
执行: pythyon test_encode.py
报了一个大bug,晴空霹雳: SyntaxError: Non-ASCII character '\xe7' in file test_encode.py on line 4, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details
看一下提示,错误出在第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 转 unicodeu = 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编码编码为文件编码,程序修改为
print u.encode("utf-8")unicode字面变量转为unicode对象
在python程序中,python2.x 中,我们可以通过在字符串前面显示的加上一个u,来说明这个字符串是一个unicode编码的值;然而,当我们获得一份文件,文件中的内容为unicode编码的字面变量的时候,我们如何把这些字符串转成unicode变量呢?
例如:
u_value=u"\u7eff\u8336\u5a4a"
print u_value
str_value = "\u7eff\u8336\u5a4a"#从文件获得
print str_value.decode("raw_unicode_escape")设计json解析的时候,如何处理编码
编码在数据格式转换中不是对称的
python数据 转 json的规则: str, unicode => string
json数据 转python的规则:string => unicode
所以,当我们用json 的load函数解析出json数据,往文件中存储之前,需要用 str_data.encode("target_coding") 将数据转成想要的字符编码.
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报