zoukankan      html  css  js  c++  java
  • 记Python2.7的一次编解码问题解决

    起因:

    在pycharm运行脚本的时候,发现中文字符在控制台输出显示成乱码了。

    各种百度,查解决方法,误打误撞的发现加个u可以解决乱码问题,其实没有真的懂为什么。

    之后就像个抄作业的学渣,就知道“三长两短,选最长”那样,反正遇到要输出中文,管他三七二十一,通通加上u。

    但是,把脚本放Linux上,在后台运行时就妥妥的报错了。。。

    于是再次走上各种查资料,解决编码问题之路:

    1.在脚本的开头加上,意思是源程序用utf-8进行编码。

    2.的‘中文’,此时还是utf-8编码。而的u'中文',已经解码成Unicode了,即 print u‘中文’等效于print ‘中文’.decode('utf-8')。

    3.在终端运行的时候,输出是按sys.stdout.encoding设置的进行编码。

    如果是后台运行,对于字符串‘中文’,还是按照脚本开头声明的utf-8来进行编码。u'中文',由于是Unicode,则按sys.getdefaultencoding()设置的进行编码。

    4.Windows上:

    sys.stdout.encoding的编码是cp936,即类似gbk的编码。

    sys.getdefaultencoding()的编码是ascii,

    Linux上:

    sys.stdout.encoding的编码是utf-8,

    sys.getdefaultencoding()的编码也是ascii,

    5.所以,,在终端运行的时候,是将Unicode字符串用cp936或者utf-8进行编码,且在编码范围内,能正确输出。

    但是,后台运行的话,用的是ascii编码,超出了ascii的编码范围,就报错了。

     解决:

    方法一:

    更改sys.setdefaultencoding的默认编码,脚本加上:

    reload(sys)
    sys.setdefaultencoding('utf-8')

    但是不推荐,原因详解:https://blog.ernest.me/post/python-setdefaultencoding-unicode-bytes

    方法二:

    将已经解码成Unicode的字符串指定正确的编码方式.

    print u'中文'.endoce('utf-8')

    其他乱七八糟的尝试:

    1.在后台执行的时候,查看进程运行情况。其中,运行第一个脚本时,没有报错,而第二个报错了。

    看起来都是root来执行脚本的,

    执行脚本时的当前目录和使用的解释器也一样

    2.所以又回到脚本文件本身来查找原因,

    发现,第一个脚本文件导入的模块中,有一个自定义模块是用方法一,更改了Python的系统默认编码,所以没有报错。

    而第二个脚本中,是没有导入这个自定义模块的。所以此时还是用ascii来对Unicode字符串进行编码的。

    参考资料:

    https://www.jianshu.com/p/b1fd7575db08

    https://liujiacai.net/blog/2016/06/30/python2-encoding/

    http://xnerv.wang/all-truths-about-python-encoding-problem/

    https://blog.csdn.net/liuyukuan/article/details/50855748

  • 相关阅读:
    解决PKIX:unable to find valid certification path to requested target 的问题
    Linux 上的常用文件传输方式介绍与比较
    用VNC远程图形化连接Linux桌面的配置方法
    红帽中出现”This system is not registered with RHN”的解决方案
    linux安装时出现your cpu does not support long mode的解决方法
    CentOS SSH配置
    es6扩展运算符及rest运算符总结
    es6解构赋值总结
    tortoisegit安装、clon、推送
    es6环境搭建
  • 原文地址:https://www.cnblogs.com/minerrr/p/9211672.html
Copyright © 2011-2022 走看看