⑴ python字符串是乱码怎么办
显示乱码的主要原因是:字符串编码集问题
其原因详细:
Windows 下的字符串编码集为GBK 而我们的Python字符串一般是 UTF-8
代码详情:
#!/usr/bin/python
# coding: utf-8
os_char='gb18030' # 定义转换类型为GB18030
print u"我是字符串" # 直接打印Unicode
print u"我是字符串".encode(os_char) # 转换为GB18030编码
print "我是字符串".decode("utf-8").encode(os_char) # 先转换为UTF-8 再转换为GB18030
备注:
之前的第一行(#!) 为Linux环境下的执行文件声明 如 Bash 的声明为 #!/bin/bash
第二行注明编码集为GB18030
Linux下的编码集为 UTF-8
⑵ python爬虫出现菱形问号乱码的解决方法
在windows下使用非idle的其他ide编辑器,会碰到这个问题。对抓取到的网页内容进行先解码再编码即可。
以requests为例:
r = r.content.decode('gbk').encode('utf-8')
出现编码问题时,
1.仔细分析错误的类型。
看是decode(解码)错误还是encode(转码)错误。
2.搞清自己处理的字符串是什么类型的。
一般看网页的charset,一般为gbk,gb2312或gb18030.其中包含字符的大小为gb2312 < gbk <gb18030。一般出现‘gbk’ codec can’t decode,是因为
(1)要处理的字符串本身不是gbk编码,但是你却以gbk编码去解码
比如,字符串本身是utf-8的,但是你却用gbk去解码utf-8的字符串,所以结果不用说,则必然出错。
(2)处理的字符的确是gbk的,但是其中夹杂的部分特殊字符,是gbk编码中所没有的
如果有些特殊字符是GB18030中有的,但是是gbk中没有的。
则用gbk去解码,去所不支持的字符,也比如会出错。
所以,此种情况,可以尝试用和当前编码(gbk)所兼容的但所包含字符更多的编码(gb18030)去解码,或许就可以了。
3.然后换用这种的字符编码去编码或解码。
详情链接:https://www.crifan.com/summary_python_unicodedecode_error_possible_reasons_and_solutions/
⑶ python用xlwt向xls中写入中文,显示乱码该怎么解决
乱码是编码问题,微软的excel默认打开的编码是gbk,如果你写入的数据是非gbk编码的,那么使用微软excel打开就会出现乱码的情况。解决方法为:对要写入的数据编码为gbk之后在进行写入,在python中的简单的操作方法如下:
1.源数据为unicode编码,则直接使用encode("gbk")即可转换编码;
str=u"我爱中国共产党"#unicode编码的字符串
des_str=str.encode("gbk")#转换为gbk编码
2.源数据不是unicode编码,那么必须先使用decode函数解码为unicode编码,在按照第一种情况转换为gbk编码。
str=u"我爱中国共产党"#unicode编码的字符串
src_str=str.encode("utf-8")#源数据格式utf-8
des_str=str.decode("utf-8").encode("gbk")#转换为gbk编码
注意:encode和decode方法为字符串的方法,不能应用与列表等其他类型的数据上
⑷ python3 中文输出乱码问题
python 3和2很大区别就是python本身改为默认用unicode编码。
字符串不再区分"abc"和u"abc", 字符串"abc"默认就是unicode,不再代表本地编码、
由于有这种内部编码,像c#和java类似,再没有必要在语言环境内做类似设置编码,比如“sys.setdefaultencoding”;
也因此也python 3的代码和包管理上打破了和2.x的兼容。2.x的扩展包要适应这种情况改写。
另一个问题是语言环境内只有unicode怎么输出gbk之类的本地编码。
答按惯例都在(序列化)输出时才转换成本地编码。
比如
file.write("GBK的中文".encode("GBK"))
python环境内字符串用str.encode("GBK")方法输出成字节串用于和其他环境交流。
⑸ 用python抓取的网页保存后为什么乱码
从你给的代码来是Python2。我下面给一个基于Python3的代码,可以参考一下:
romurllib.requestimporturlopen;
fromurllib.parseimportquote;
rawtext=urlopen('http://www.ccnu.e.cn',timeout=15).read();
print(rawtext)
rawtext=rawtext.decode('gbk')
print(rawtext)
f=open('ccnu.txt','w',encoding='utf8');
f.write(rawtext)
大概的原理是,在Python3下面,抓取到的页面默认是byte类型的(通过第4行输出的结果就可以看出来),我们需要根据网页的实际编码进行处理。本例中给的网页使用的是gb2312。所以,我要先以gbk的格式进行解码(gbk包含了gb2312,能够表示更多的汉语字符),解码后实际上得到的就是unicode码了,由于我的控制台编码设置的是utf8,在打印时系统会自动将字符串从unicode转为utf8,所以第6行控制台打印结果正常;第7行写入文件时也要指定文件的编码格式,我这里选择的是utf8,当然用gbk也是一切正常的,因为这个编码设置的是保存文件的编码,而不是原来那个网页内容的编码了。字符串编码和文件编码不是一回事。打开ccnu.txt发现无乱码。
Python2的代码我不熟。
建议你也在代码中添加print 看控制输出是否正常。如果控制台输出正常,则有可能是在保存页面文件时,没有正确指定内容字符串的encode格式。或者把所有gb2312换为gbk再试试。
反正Python2下面极容易出现汉字乱码,如果能理解编码encode和解码decode的含义,了解Python2的字符串处理过程,就可以避免这些问题。
⑹ python编程中中文输出乱码UnicodeEncodeError: 'ascii' codec can't encode character
楼主你好!
其实按照你的代码的逻辑来做是没有错的,无法显示成utf-8编码的文本其实是因为在request请求的时候,按照网页的标识转了码,接着BeautifulSoup把已经是utf-8的文本又强转了一次utf-8编码,导致了无法正确的显示,以想要拿到的时间为例,其实程序的目标字符串应该如下:
#-*-coding:utf-8-*-
'''我们想要使用的字符串'''
target_str=':53'
'''两次转码后的字符串'''
get_str=u':53'
归根结底是两个对象的类不同,但python不支持这两种类型的强转,个人想了个比较临时的解决方案,算是个python打了个补丁,就是将字符串转成二进制,再转回字符串,这样就unicode就不用给他加上编码方式再转成二进制字符串了,修改后的代码如下:
#-*-coding:utf-8-*-
importrequests
frombs4importBeautifulSoup
fromdatetimeimportdatetime
defencode(s):
'''将字符串转成二进制'''
return''.join([bin(ord(c)).replace('0b','')forcins])
defdecode(s):
'''将二进制转换成字符串'''
return''.join([chr(i)foriin[int(b,2)forbins.split('')]])
res=requests.get('
)
res.encodeing='utf-8'
soup=BeautifulSoup(res.text,'html.parser')
'''每个中文字符都进行转换处理'''
title=decode(encode(soup.select('#artibodyTitle')[0].text))
time=decode(encode(soup.select('.time-source')[0].contents[0].strip()))
chinese='%Y年%m月%d日%H:%M'
timesource=datetime.strptime(time,chinese)
print(title)
print(timesource)
看楼主在研究的过程中,对字符串的编码原理的理解还有所欠缺,这方面的资料在网上很多,可以再自行研究一下,能够获得长足的进步。
望采纳,谢谢!
⑺ Python中中文乱码问题
a ='哈哈'
b = a.encode('utf-8')
以上你的代码是UTF8编码吧,a本来就是UTF8编码,你在给它编码干嘛,encode是编码,decode是解码,你不报错没天理。
a = u'哈哈'
b = a.encode('utf-8')
a是U编码类型也就是你上一个没加U的哈哈的解码,它肯定不会保存!
⑻ python解决csv文件用excel打开乱码问题
【问题】
python输出的csv文件用excel打开,里面的中文会变成乱码,但用window下的记事本或mac下的numbers打开就正常显示。
原因是python输出的文件是utf-8编码写入的,excel默认以gbk方式读取,导致乱码发生。
【解决方法1】文件产出时encoding设置为utf-8-sig
用excel打开csv时,excel会先检查文件的第一个字符,来了解这个文件是什么编码方式,如果这个字符是BOM,excel就知道用utf-8的方式打开这个文件。python自带了处理BOM的编码方式uft-8-sig,因此只需要在文件产出时将encoding设置为utf-8-sig。
如果文件不是由python产出的,只需要以utf-8方式读入再以utf-8-sig方式存储即可
【解决方法2】懒人法,适用只含简体中文的文件
用记事本打开,点击另存为,右下角编码方式选择“ANSI”,这个过程是把这个文件改成gbk编码格式,excel就是默认用gbk方式打开的。
参考: Python写的csv文件,如何让 Excel 双击打开不乱码? - 云+社区 - 腾讯云
对编码格式一窍不通的可以阅读以下网页
python笔记——二进制和文件编码_砍柴姑娘Jourosy的博客-CSDN博客
编码方式之ASCII、ANSI、Unicode概述 - 蓝海人 - 博客园
【简单总结】:
1. 首先需要了解 字符集 和 字符编码 两个概念,字符集定义了字符和二进制的一一对应关系,字符编码规定了如何将字符的编号存储到计算机中。
2. Unicode是字符集,包含了全球文字的唯一编码,utf-8是编码方式,将unicode以某种方式存储到计算机中。
3. 有些字符集和编码是结合在一起的,称作字符集还是编码都无所谓,比如ASCII,GBK
4. ANSI是各个国家地区不同扩展编码方式的总称,互不兼容(可以看出来通用性没有utf好)
5. 不同编码方式在转换时,通常需要以unicode作为中间编码,即先将其他编码的字符串解码(decode)成unicode,再从unicode编码(encode)成另一种编码。
⑼ python中文显示乱码,已经在开头有了coding: utf-8
乱码原因:
因为你的文件声明为 utf-8,并且也应该是用 utf-8 的编码保存的源文件。但是 windows 的本地默认编码是 cp936,也就是 gbk 编码,所以在控制台直接打印 utf-8 的字符串当然是乱码了。
解决方法:
py文件用记事本打开,另存为utf-8格式即可
⑽ python 中文乱码问题
记事本是用utf-8保存你下载了东西的。你下载下来的不是utf-8,保存下来中文当然就乱码了。而gbk和utf-8里英文的编码值都一样,所以不受影响。
一个方法是你留意下目标页面的charset 和 contentType,另一个方法是你复制一个目标页面的字,放cmd里看它的编码长度,以此来判断它的原来编码。