• python 编码问题


    参考原文:http://www.crifan.com/eclipse_pydev_console_messy_char_for_console_is_utf8/

     通用

    rq = urllib.urlopen(url)
    
    respHtml = rq.read()
    
    respInfo = rq.info()
    
    if("Content-Encoding" in respInfo):
        if "gzip" == respInfo['Content-Encoding']:
            respHtml = zlib.decompress(respHtml, 16+zlib.MAX_WBITS)
        elif "deflate" == respInfo['Content-Encoding']:
            respHtml = zlib.decompress(respHtml, -zlib.MAX_WBITS)
    View Code

    如果出现 --- u'xe4xbbx8axe5xa4xa9' 这种情况:

    str1 = u'xe4xbbx8axe5xa4xa9'
    print str1.encode('latin1').decode('utf8')

    解这个问题的 tricky 之处在于利用这个特性: 
    Unicode codepoints U+0000 to U+00FF all map one-on-one with the latin-1 encoding 

    先将 unicode 字符串编码为 latin1 字符串,编码后保留了等价的字节流数据。 
    而此时在这个问题中,这一字节流数据又恰恰对应了 utf8 编码,因此对其进行 utf8 解码即可还原最初的 unicode 字符。 
    不过值得注意的是,需要确定的是形如xe8xb4xa2 究竟是 utf8 编码还是类似 gbk 的其他类型编码, 
    这一点对于最终正确还原 unicode 字符也是同样重要的。 

    出现原因参考:http://stackoverflow.com/questions/9845842/bytes-in-a-unicode-python-string

    python3 中使用  unicode_escape

    print('英国'.encode("unicode_escape"))
    >>> b'\u82f1\u56fd'

     如果是 '\x\x\x' 这种类型 可以通过以下两种方式

    a = '5424gdfg\x63\x73\x4b\x48\x77\x71\x4d\x49'
    print(text.encode().decode('unicode_escape'))

    import ast

    a = '"' + a + '"'
    print(ast.literal_eval(a))

    URLEncode 与 unquote

    from urllib import unquote

    例如:http://fz.letfind.com/fang/citylist.asp

    可以直接用unquote解码,但是 %u4E09%u660E 这种是不能转码的。

    参考:http://bbs.htpc1.com/thread-92901-1-1.html

    解码方法:先用替换将字符串"%uxxxx%uxxxx"转化为"u'uxxxxuxxxx'",然后用eval函数强制转换为unicode

    aaa = '%u4E09%u660E'
    bbb=eval("u'"+aaa.replace("%","\")+"'")
    print bbb

    备注:eval(str [,globals [,locals ]])函数将字符串str当成有效Python表达式来求值,并返回计算结果

    顺带提供一个编码方法,以后一样用得到:

    a = "我是中国人"
    b = ''
    for item in a.decode("utf8"):
        b = b + "%u" + "%x" % ord(item)
    print b
    View Code

    备注:
    (1)ord()函数返回对应的ASCII数值,或者Unicode数值
    (2)%是格式化运算符,%x 无符号十六进制整数,a~f采用小写形式;%X 无符号十六进制整数,A~F采用大写形式

    alert('u6682u65F6u65E0u6CD5u83B7u53D6u8BE5u623Fu6E90u4FE1u606FuFF0Cu8BF7u7A0Du540Eu5C1Du8BD5uFF01');location.href='http://cd.letfind.com';

    直接用 .decode('unicode-escape') 转换成中文

     python3:

    from urllib import parse
    url = quote(url, safe=string.printable)
    url = quote(url, safe='/:?=')

    url 链接中包含中文的,只对中文进行url编码:

    list_url = urllib.quote(list_url.encode('gb2312'), safe=string.printable)

    对post数据编码:

    post_data = urllib.urlencode(values)

    接受参数形式为:[(key1, value1), (key2, value2),...] 和 {'key1': 'value1', 'key2': 'value2',...}

    python3

    from urllib import parse
    data = parse.urlencode(data).encode('utf-8')




    判断字符编码类型:

    import chardet
    print chardet.detect('吾问无为谓我我我我')

    {'confidence': 0.99, 'encoding': 'utf-8'}


    
    
    #coding=utf8
    # python2
    import HTMLParser
    
    parser = HTMLParser.HTMLParser()
    s1 = parser.unescape('测试')
    print s1
    # output: 测试
    s2 = parser.unescape('测试')
    print s2
    # output: 测试 

    # python3 转换
    import html
    s1 = "图片中可能有:2 位用户"
    print(html.unescape(s1))
    # output: 图片中可能有2位用户

    或者替换 &#x 为 u



    url 的编码方式:
    a = '辛集市'
    b = u'辛集市'
    print urllib.quote(a) # %E8%BE%9B%E9%9B%86%E5%B8%82
    print urllib.quote(a.encode('gbk')) # %D0%C1%BC%AF%CA%D0
    print urllib.quote(b.encode('gbk')) # %D0%C1%BC%AF%CA%D0
    print urllib.quote(b) # 直接编码会报错 KeyError


    下载网页通用编码问题:
    def get_root(url,send_headers=None):
        '''
        获取url的root节点
        :param url:
        :return:
        '''
        try:
            if send_headers is not None:
                request = urllib2.Request(url=url, headers=send_headers)
            else:
                request = urllib2.Request(url=url)
            resp = urllib2.urlopen(request,timeout=10)
            resp_html = resp.read()
            resp_info = resp.info()
            if "Content-Encoding" in resp_info:
                if "gzip" == resp_info['Content-Encoding']:
                    resp_html = zlib.decompress(resp_html, 16+zlib.MAX_WBITS)
                elif "deflate" == resp_info['Content-Encoding']:
                    resp_html = zlib.decompress(resp_html, -zlib.MAX_WBITS)
    
            resp.close()
            code = chardet.detect(resp_html)['encoding'] # 获取编码方式1
            if code is None:
                code = resp_info.getparam('charset') # 获取编码方式2
    
    
            html = resp_html.decode(code, 'ignore')
            root = htmlparser.fromstring(html)
            return root
        except Exception, e:
            print 'get_root error:', url, e
    View Cod

  • 相关阅读:
    03-spring bean
    04-spring的依赖注入
    01-课程安排
    17-注解开发
    WIN10新机必要设置记录 for 3dsmax
    ps导出svg
    VS C# 共享项目
    在Maxscript中创建.Net类型
    C# 自定义索引
    C# ?
  • 原文地址:https://www.cnblogs.com/haoxr/p/5355879.html
Copyright © 2020-2023  润新知