zoukankan      html  css  js  c++  java
  • UnicodeEncodeError: 'ascii' codec can't encode character u'u6211' in position 0: ordinal not in range(128)

      工作中遇到如下问题

    >>> str(u'')
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    UnicodeEncodeError: 'ascii' codec can't encode character u'u6211' in position 0: ordinal not in range(128)

    解决方式如下

    >>> str(u''.encode('utf-8'))
    'xe6x88x91'

    即把unicode转为utf-8编码。但是不是unicode字符都这样处理呢?看下面的

    >>> str(u'abc')
    'abc'

    以上不处理一样可以的!

    为什么会这样?http://docs.python.org/2/howto/unicode.html里有一段已经说的很明显了。

    即:

    内置函数 unicode() 提供了访问(编码和解码)所有已注册的 Unicode 编码的方法。它能转换众所周知的 Latin-1, ASCII, UTF-8, 和 UTF-16。后面的两个可变长编码字符集用一个或多个 byte 存储 Unicode 字符。默认的字符集是 ASCII,它只处理0到127的编码,拒绝其它的字符并返回一个错误。当一个 Unicode 字符串被打印、写入文件或通过 str() 转化时,它们被替换为默认的编码。

    再看下面的例子

    In [5]: a = u'你好'
    
    In [6]: a
    Out[6]: u'u4f60u597d'
    
    In [7]: b = '你好'
    
    In [8]: b
    Out[8]: 'xe4xbdxa0xe5xa5xbd'
    
    In [9]: print a
    你好
    
    In [10]: print b
    你好

    从上面我看出几点疑问:

       1   中文的常量,不论字符串,还是unicode它显示的这些到底是什么?其实这些就是常量在系统默认编码。那上面我的系统默认编码到底是GBK显示还是UTF-8显示呢?

    因为我的是centos的所以只需要vi  /etc/sysconfig/i18n 就知道了, 我的是utf-8的,

       2  无论print a还是print b都正确显示了我所认识的汉字“你好”这又是怎么回事?这最好还是看一下源码,不过我能力有限,只能自行google了,基本上大致意思就是print打印会自动给对象编码,比如一个unicode对象,用print打印,它都会自行转化成当前编码,但是如果是write方式就不行,必须你自己手动去处理编码。这也就是上面提到的报错原因。

    说了上面的,还有一个问题困挠我,decode()跟encode()方法

    “decode是string2unicode,encode自然就是unicode2string。”

    虽然就一句话的事,但我就是记不住。不知道各位是怎么理解的,然后能熟练运用的。反正我每次用的时候都是当场试验。都哪天我终于理解或者明白了,我再来把这个坑给补了吧~~

    BTW:如果是windows系统,我下面的是xp的查找系统默认编码方式

    然后打开控制面板-->语言与区域选项--->高级选项里查找代码页转换表

     

    ,936对应的是GBK编码。

    即我的操作系统的默认编码是GBK

     参考:

    http://blog.csdn.net/feisan/article/details/1666876

    http://blog.csdn.net/feisan/article/details/1667417

    http://pycoders-weekly-chinese.readthedocs.org/en/latest/issue5/unipain.html

    http://blog.csdn.net/trochiluses/article/details/16825269

  • 相关阅读:
    线程包含CPU现场
    K8S资源操作
    Kubernetes资源管理
    kubernetes部署安装
    kubernetes简介
    Docker总结
    3.11 虚拟局域网
    3.10 以太网交换机生成树协议STP
    3.9 以太网交换机自学习和转发帧的流程
    3.8 集线器与交换机的区别
  • 原文地址:https://www.cnblogs.com/liuyongjians/p/3598746.html
Copyright © 2011-2022 走看看