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

原文地址:https://www.cnblogs.com/haoxr/p/5355879.html