zoukankan      html  css  js  c++  java
  • python 中文乱码

    1,print 函数打印时,乱码的处理就交给了,os来做,只负责发送字符串给它。?(看来不是,因为python 在print 时自动读取。sys.stdout.encoding 属性值,自动进行编码)

    还有,utf-8 和 gkb等等之间相互转换,只需python 存贮了各自的编码规则,按照该规则编码,解码都可以,不是什么大事,麻烦事,只是转的时候,ascii 范围很小,发现很多字符没有对应,所以会抛出错误。

    python 中字符串,分为两种,一种是unicode的s=u'哈哈',另外一种是 s = '哈哈',该种已经按照python encoding 的属性,进行了编码?

    2,本质上不变的是,按各种的存储方式,在内存中真是的编码方式,如果是utf-8,每个中文就会存三个字节\x12\x23\xe4,如果是unicode每个汉字就占2个字节16位\u23412\u234e

    1 import sys
    2 print sys.getdefaultencoding()
    3 # 'ascii'

    解决的方案很简单,修改默认的编码模式,很多朋友会想到setdefaultencoding,是的,我们可以通过sys.setdefaultencoding(‘utf-8′)来将当前的字符处理模式修改为utf-8编码模式,值得注意的是,如果单纯这么调用的话,Python会抛出一个AttributeError异常:基本上是ascii编码方式,由此Python自然调用ascii编码解码程序去处理字符流,当字符流不属于ascii范围内,就会抛出异常(ordinal not in range(128))。

    1 Traceback (most recent call last):
    2   File "<stdin>", line 1, in <module>
    3 AttributeError: 'module' object has no attribute 'setdefaultencoding'
    竟然说sys没有setdefaultencoding的方法,其实sys是有这个方法的,但是要请出她老人家需要调
    用一次reload(sys),?如果有谁知道原因的话,还望不吝赐教。
     
    1 import sys
    2 reload(sys)
    3 sys.setdefaultencoding('utf-8')
    import sys 
    
    print 'default encoding: ' , sys.getdefaultencoding()
    print 'file system encoding: ' , sys.getfilesystemencoding()
    print 'stdout encoding: ' , sys.stdout.encoding
    print u'u"中文" is unicode: ', isinstance(u'中文',unicode)
    print u'"中文" is unicode: ', isinstance('中文',unicode) 

    看输出结果,注意下列事实:

    python系统缺省的编码格式为ASCII,这个缺省编码在Python转换字符串时用的到,这里给两个例子:

    1. a = "abc" + u"bcd", Python会如此转换"abc".decode(sys.getdefaultencoding()) 然后将两个Unicode字符合并。

    2. print unicode('中文') , 这句话执行会出错“UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 …”,是因为Python试图用缺省编码来编码,而这个字符串不是ASCII,因此需要显示的指出,如果你的文件源类型为utf-8,则应如此:print unicode('中文','utf-8’)

    Windows下getfilesystemencoding输出mbcs(多字节编码,windows的mbcs,也就是ansi,它会在不同语言的windows中使用不同的编码,在中文的windows中就是gb系列的编码)

    Windows下控制台编码为cp936, 当你打印东西到控制台时Python自动做了转换。这里会引发一个有趣的问题, 试一下这个简单的例子test.py:

    在控制台中分别运行 python test.py 和 python test.py > 1.txt

    你会发现后者会报错,原因是打印控制台时Python会自动转换编码到sys.stdout.encoding, 而输出到文件时Python不会自动在write调用中进行内部字符转换。这个问题在PrintFails中有较详细的说明。

  • 相关阅读:
    启智树提高组Day4T3 2的幂拆分
    拉格朗日插值
    #3342. 「NOI2020」制作菜品
    P6776 [NOI2020]超现实树
    P6773 [NOI2020]命运
    P5298 [PKUWC2018]Minimax
    每日总结5.20
    每日总结5.19
    每日总结5.18
    每日总结5.17
  • 原文地址:https://www.cnblogs.com/harveyaot/p/2980400.html
Copyright © 2011-2022 走看看