python爬虫乱码

ASCII: 一个字节
Unicode:两个字节
Unicode的实现方式称为Unicode转换格式(Unicode Translation Format, UTF)UTF实现方式有两种:
1、UTF-8:对于大多数字符集,它只使用单字节,对于其他字符特别是中文、日文、韩文等象形文字,它使用3字节
    UTF-8是为了节约资源,避免Unicode对英文编码使用两个字节造成浪费。
2、UTF-16:大致相当于20位编码
计算机系统通用字符编码方式:
在计算机内存中,统一使用Unicode编码,当需要保存到硬盘或者需要传输时,转换为UTF-8; 用记事本编辑时,从文件读取的UTF-8字符被转换为Unicode
字符保存在内存里,编辑完后,再把Unicode转换为UTF-8保存到文件
CPU是从内存中提取信息的,硬盘的信息要通过内存提取就是说内存是个中转站
浏览网页时,服务器会把动态生成的Unicode内容转换为UTF-8再传输到浏览器

————————————————————
python乱码问题:

字符串在python内部中是采用unicode的编码方式,所以其他语言先decode转换成unicode编码,再encode转换成utf8编码。
u=u'汉'    #字符串在代码中被定义为s=u'中文',则s就是python内部编码unicode
s=u.encode('UTF-8')   #将unicode形式的u编码为UTF-8形式
u2 = s.decode('UTF-8')    #将UTF-8形式的s解码为unicode形式
使用内置的open()打开文件时,read()读取的是str,读取后需要用正确的编码格式进行decode()操作,转换为unicode形式
eg:
# coding: utf-8
f = open('test.txt')
s = f.read()
f.close()
print type(s)     #得到s编码格式,假如为GBK格式
u = s.decode('GBK')    #将GBK格式转换为unicode格式

write()写入是,若参数是unicode,则需要将你希望写入的编码用encode()转换为UTF-8格式;若不是unicode,则先decode()
转换为unicode,再encode()转为UTF-8

模块codecs提供open()方法,可以指定一个编码来打开文件,打开文件读取返回的将是unicode。写入时,若参数是unicode,则使用open()时指定的
编码进行编码后写入,若时str,则先转换为unicode,再进行上述操作。
f = codecs.open('test.txt', encoding='UTF-8')   #指定用UTF-8编码打开文件
u = f.read()    #读取返回的u时unicode格式
f.close()
f  = codecs.open('test.txt',  'a' ,encoding='UTF-8')
f.write(u)        #写入unicode,会自动将unicode转换为UTF-8写入test.txt中
#写入str,会自动进行解码编码
s = '汉’        #s为GBK编码的str
f.write(s)       #这里会先将GBK编码的str解码为unicode再编码为UTF-8写入
f.close()

建议:
使用字符编码声明
抛弃str,全部使用unicode,再按引号前按u
使用codecs.open() 代替open()
字符自动检测:
from bs4 import UnicodeDammit
dammit = UnicodeCammit(u"字符二进制码“)
print(dammit.unicode_markup)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值