食物发动机 2018-01-20 13:26 采纳率: 100%
浏览 1952
已采纳

python启动http服务器出现unicodeDecodeError怎么解决

图片说明

  • 写回答

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 sys

    lvchabiao="绿茶婊"

    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 转 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编码编码为文件编码,程序修改为
    print u.encode("utf-8")

    1. 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")

    2. 设计json解析的时候,如何处理编码
      编码在数据格式转换中不是对称的
      python数据 转 json的规则: str, unicode => string
      json数据 转python的规则:string => unicode
      所以,当我们用json 的load函数解析出json数据,往文件中存储之前,需要用 str_data.encode("target_coding") 将数据转成想要的字符编码.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(5条)

报告相同问题?

悬赏问题

  • ¥20 sub地址DHCP问题
  • ¥15 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程
  • ¥15 redis-full-check比较 两个集群的数据出错
  • ¥15 Matlab编程问题
  • ¥15 训练的多模态特征融合模型准确度很低怎么办
  • ¥15 kylin启动报错log4j类冲突
  • ¥15 超声波模块测距控制点灯,灯的闪烁很不稳定,经过调试发现测的距离偏大