• 乱码问题引申 python 中string和unicode


    HtmlTestRunner的乱码问题


    1生成的报告中,对print打印的数据都记录下来,但是数据有些会存在乱码。如下面。有些又没有乱码。
    这到底是怎么回事呢?
     
            str=t.encode('utf-8')
            print str
    第一个test我以utf-8编码,看来htmlTestRunner不是utf-8 编码。
    为何第二个正确了呢?
    第二个是unicode编码方式。
    也就是说,可以被其他任何encode了。
     
    原码中已这个进行编码,也就是说他设置为latin-1这种编码方式了。估计是作者自己国家的一种编码方式。
     
    修改为如下后,问题解决
     

     说明,python2.7以下以上修改就可以,python3以上版本还需修改其他地方。我是从虫师书里进行修改再来研究这个问题的。

     

    引申出来一个问题。string和unicode


    string类型是字符串。会形成不同的编码集。
    输入时为utf-8编码,输出时设置的编码集为utf-8。他就解码正常,会正确打印输入的内容。
    如果输入时为utf-8。输出为gbk呢?就会乱码。
     

    如何进行编码


     
     
    #代码中设置编码格式
    #coding:utf-8
    # -*-coding=utf-8 -*-
     

    如何解码


     
    如果是后台日志,他会自动解码,如果是前台页面。或者数据库呢?
    他们都设置了类似的编码格式。
     
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
     
    所有不需要我们做什么,双方定义好了规则,他们自动的编码和解码了。
    输入:print('你好')
    前台就打印了你好。
     

    如何解决乱码


     
    如果定错了,就会出现乱码。这就是乱码的由来。就像上方所说:如果输入时为utf-8。输出为gbk呢?就会乱码。
     
    这时候就是看问题出在哪方,把规则定义好。
     
    上面只讲述了输入输出双方的自动编码和解码。可在python中提供一套编码和解码的方法(其他语言肯定也提供一套方法)。
     
    这时候需要说说unicode。unicode是国际统一码,就如同标准时间一样。是唯一的。
    def test_encode_decode():
        '''    
        . 展示 str的编码方式     
        .  encode(),decode()方法内默认编码格式为utf-8
        '''
        '基本方式'
        print repr('你好'),   '    string(utf-8)'
        print repr(u'你好'),  '    unicode(unicode)'
        
        '错误使用:    string(utf-8) -> string(gbk)【错误】 -> unicode(unicode)'
        #print repr('你好'.encode('gbk').decode())#以gbk解码【错误方法】报错
        
        '单独使用decode,encode'
        print repr('你好'.decode()),  '    string(utf-8) -> unicode(unicode)'# 转换成了unicode方法
        print repr(u'你好'.encode('gbk')),    '    unicode(unicode) -> string(gbk)'
        
        '组合使用decode,encode:    更改string的编码类型,编码再解码'
        print repr('你好'.decode().encode('gbk')),    '    string(utf-8) -> unicode(unicode) -> string(gbk)'
        print repr('你好'.encode('utf-8').decode()),  '    string(utf-8) -> string(utf-8) -> unicode(unicode)'#与 '你好'.decode() 结果一致
        
        'gbk -> unicode'
        str1=u'你好'.encode('gbk')#gbk编码
        print repr(str1.decode('gbk')),  '    string(gbk) -> unicode(unicode)' 
        print repr(str1.decode('gbk').encode()),  '    string(gbk) -> unicode(unicode) -> string(utf-8)' 

    结果为

     
  • 相关阅读:
    【转】Java并发编程:synchronized
    【转】Java并发编程:Thread类的使用
    【转】Java并发编程:如何创建线程?
    【计算机二级C语言】卷005
    【计算机二级C语言】卷004
    【计算机二级C语言】卷003
    【计算机二级C语言】卷002
    【计算机二级C语言】卷001
    汇编窥探Swift String的底层
    【KakaJSON手册】08_其他用法
  • 原文地址:https://www.cnblogs.com/q2z2012/p/7449284.html
Copyright © 2020-2023  润新知