pythongbkunicode
A. python write 写入为什么会报这个错'gbk'codec can't encode character \xbb'i
使用Python写文件的时候,或者将网络数据流写入到本地文件的时候,大部分情况下会遇到:UnicodeEncodeError:
'gbk'
codec
can't
encode
character
'\xa0'
in
position
...
这个问题。
网络上有很多类似的文件讲述如何解决这个问题,但是无非就是encode,decode相关的,这是导致该问题出现的真正原因吗?不是的。
很多时候,我们使用了decode和encode,试遍了各种编码,utf8,utf-8,gbk,gb2312等等,该有的编码都试遍了,可是编译的时候仍然出现:
UnicodeEncodeError:
'gbk'
codec
can't
encode
character
'\xa0'
in
position
XXX。
崩溃了。
在windows下面编写python脚本,编码问题很严重。
将网络数据流写入文件时时,我们会遇到几个编码:
1:
#encoding='XXX'
这里(也就是python文件第一行的内容)的编码是指该python脚本文件本身的编码,无关紧要。只要XXX和文件本身的编码相同就行了。
比如notepad++
"格式"菜单里面里可以设置各种编码,这时需要保证该菜单里设置的编码和encoding
XXX相同就行了,不同的话会报错
2:网络数据流的编码
比如获取网页,那么网络数据流的编码就是网页的编码。需要使用decode解码成unicode编码。
3:目标文件的编码
要将网络数据流的编码写入到新文件,那么我么需要指定新文件的编码。写文件代码如:
复制代码代码如下:
f.write(txt)
,那么txt是一个字符串,它是通过decode解码过的字符串。关键点就要来了:目标文件的编码是导致标题所指问题的罪魁祸首。如果我们打开一个文件:
复制代码代码如下:
f
=
open("out.html","w")
,在windows下面,新文件的默认编码是gbk,这样的话,python解释器会用gbk编码去解析我们的网络数据流txt,然而txt此时已经是decode过的unicode编码,这样的话就会导致解析不了,出现上述问题。
解决的办法就是,改变目标文件的编码:
复制代码代码如下:
f
=
open("out.html","w",encoding='utf-8')
B. python怎么转换unicode编码
用decode()就行。decode()方法必须传入一个参数,这个参数就是当前待转码的编码,此函数方法的用意就是将当前编码为Unicode编码。
比如就你这提问的此页面:
#使用版本是python2.
importurllib
url='https://..com/question/1499967322379602619.html?entry=qb_ihome_tag&hideOtherAnswer=true&newAnswer=1'
html=urllib.urlopen(url).read()
result=html.decode('gbk')
printresult
方法是绝对可行的
此法对字符串和文档内容的解码一样有效。
C. 执行python脚本出现乱码怎么解决
执行python脚本出现乱码的解决方法:首先把中文解码为unicode,具体方法如:【decode('utf-8')】;然后再转化为gbk即可,具体方法如:【encode('gbk')】。
问题:
代码中指定了UTF-8编码,但是在cmd命令行窗口时打印的中文仍然会乱码。
(推荐教程:Python入门教程)
原因:
windows下中文默认的输出编码为gbk ,与脚本中定义的UTF-8不一样,所以出现了解码失败的情况。
解决方法:
可以先把中文解码为unicode,然后再转化为gbk来解决这个问题。
举例:
运行结果:
D. python中unicode编码有多少(2023年最新解答)
导读:今天首席CTO笔记来给各位分享关于python中unicode编码有多少的相关内容,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
python有哪几种编码方式第一种:ASCII码。是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言,它是现今最通用的单字节编码系统,并等同于国际标准IS/IEC
646。
由于计算机是美国人发明的,因此,最早只有127个字母被编码到计算机李,也就是大小写英文字母、数字和一些符号,这个编码表被称为ASCII编码,比如大写字母A的编码是65,小写字母a的编码是97,后128个称为扩展ASCII码。
第二种:GBK和GB2312。能在计算机中显示中文字符是至关重要的,然而ASCII表里一个偏旁部首都没有,所以我们需要一个关于中文和数字对应的关系表,一个字节只能最多表示256个字符,用处理中文显然一个字节是不够的,所以我们需要采用两个字节来表示,所以中国制定了GB2312编码,用来将中文编写进去。
第三种:Unicode。因为各个国家都有一套自己的编码,所以无法避免冲突,因此Unicode诞生了。它可以把所有语言都统一到一套编码里,这样就不会存在乱码问题了,现代操作系统和大多数编程语言都直接支持Unicode。
第四种:UFT-8。基于节约的原则,出现了把Unicode编码转化为可变长编码的UTF-8编码。而UTF-8编码把一个Unicode字符根据不同的数字大小编码成1-6个字节,常用的英文字母被编码成一个字节,汉字通常是3个字节,只有很生僻的字符才会被编码成4-6个字节,如果你要传输的文本包含大量英文字符,用UTF-8编码就能节省空间。
python3.4编码有哪些Python3中的编码问题前,第一个段落对字节、ASCII与Unicode与UTF-8等进行基本介绍,如果不对这几种编码犯头晕,可直接跳过。
ASCII与Unicode与UTF-8与GBK
首先从老大哥说起。跟很多人一样,大学读了这么久,久仰ASCII编码的大名。要说这个老大哥,我们再先从字节说起。一个字节包括八个比特位,每个比特位表示0或1,一个字节即可表示从00000000到11111111共2^8=256个数字。一个ASCII编码使用一个字节(除去字节的最高位作为作奇偶校验位),ASCII编码实际使用一个字节中的7个比特位来表示字符,共可表示2^7=128个字符。比如那时写C语言的程序,就经常要背下ASCII编码中的01000001(即十进制的65)表示字符‘A’,01000001加上32之后的01100001(即十进制的97)表示字符‘a’。现在打开Python,调用chr和ord函数,我们可以看到Python为我们对ASCII编码进行了转换。
第一个00000000表示空字符,因此ASCII编码实际上只包括了
字母、标点符号、特殊符号等共127个字符。因为ASCII是在美国出生的,对于由字母组成单词进而用单词表达的英文来说也是够了。但是中国人、日本人、
韩国人等其他语言的人不服了。中文是一个字一个字,ASCII编码用上了浑身解数256个字符都不够用。
因此后来出现了Unicode编码。Unicode编码通常由两个字节组成,共表示256*256个字符,即所谓的UCS-2。某些偏僻字还会用到四个字节,即所谓的UCS-4。也就是说Unicode标准也还在发展。但UCS-4出现的比较少,我们先记住:最原始的ASCII编码使用一个字节编码,但由于语言差异字符众多,人们用上了两个字节,出现了统一的、囊括多国语言的Unicode编码。
在Unicode中,原本ASCII中的127个字符只需在前面补一个全零的字节即可,比如前文谈到的字符‘a’:01100001,在Unicode中变成了0000000001100001。不久,美国人不开心了,吃上了世界民族之林的大锅饭,原本只需一个字节就能传输的英文现在变成两个字节,非常浪费存储空间和传输速度。
人们再发挥聪明才智,于是出现了UTF-8编码。因为针对的是空间浪费问题,因此这种UTF-8编码是可变长短的,从英文字母的一个字节,到中文的通常的三个字节,再到某些生僻字的六个字节。解决了空间问题,UTF-8编码还有一个神奇的附加功能,那就是兼容了老大哥的ASCII编码。一些老古董软件现在在UTF-8编码中可以继续工作。
注意除了英文字母相同,汉字在Unicode编码和UTF-8编码中通常是不同的。比如汉字的‘中’字在Unicode中是01001110
00101101,而在UTF-8编码中是1110010010111000
10101101。
我们祖国母亲自然也有自己的一套标准。那就是GB2312和GBK。当然现在挺少看到。通常都是直接使用UTF-8。记得我唯一一次看到GB编码的网页,是一个成人网站。
Python3中的默认编码
Python3中默认是UTF-8,我们通过以下代码:
importsys
sys.getdefaultencoding()
可查看Python3的默认编码。
Python3中的encode和decode
Python3中字符编码经常会使用到decode和encode函数。特别是在抓取网页中,这两个函数用的熟练非常有好处。我的理解,encode的作用,使我们看到的直观的字符转换成计算机内的字节形式。decode刚好相反,把字节形式的字符转换成我们看的懂的、直观的、“人模人样”的形式。如下图。
x表示后面是十六进制,xe4xb8xad即是二进制的1110010010111000
10101101。也就是说汉字‘中’encode成字节形式,是1110010010111000
10101101。同理,我们拿11100100
1011100010101101也就是xe4xb8xad来decode回来,就是汉字‘中’。完整的应该是b'xe4xb8xad',在Python3中,以字节形式表示的字符串则必须加上前缀b,也就是写成上文的b'xxxx'形式。
前文说的Python3的默认编码是UTF-8,所以我们可以看到,Python处理这些字符的时候是以UTF-8来处理的。因此从上图可以看到,就算我们通过encode('utf-8')特意把字符encode为UTF-8编码,出来的结果还是相同:b'xe4xb8xad'。
明白了这一点,同时我们知道UTF-8兼容ASCII,我们可以猜想大学时经常背诵的‘A’对应ASCII中的65,在这里是不是也能正确的decode出来呢。十进制的65转换成十六进制是41,我们尝试下:
b'x41'.decode()
结果如下。果然是字符‘A’
Python3中的编码转换
据说字符在计算机的内存中统一是以Unicode编码的。只有在字符要被写进文件、存进硬盘或者从服务器发送至客户端(例如网页前端的代码)时会变成utf-8。但其实我比较关心怎么把这些字符以Unicode的字节形式表现出来,露出它在内存中的庐山正面目的。这里有个照妖镜:
xxxx.encode/decode('unicode-escape')
输出如下
b'\u4e2d'还是b'u4e2d,一个斜杠貌似没影响。同时可以发现在shell窗口中,直接输'u4e2d'和输入b'u4e2d'.decode('unicode-escape')是相同的,都会打印出汉字‘中’,反而是'u4e2d'.decode('unicode-escape')会报错。说明说明Python3不仅支持Unicode,而且一个‘uxxxx’格式的Unicode字符可被辨识且被等价于str类型。
如果我们知道一个Unicode字节码,怎么变成UTF-8的字节码呢。懂了以上这些,现在我们就有思路了,先decode,再encode。代码如下:
xxx.decode('unicode-escape').encode()
测试如下:
可以看到最后输出的UTF-8字节与上面的相同。尝试成功。所以其他的编码之间的转换,大概也是如此。
最后的扩展
还记得刚刚那个ord吗。时代变迁,老大哥ASCII被人合并,但ord还是有用武之地。试试ord('中'),输出结果是20013。20013是什么呢,我们再试试hex(ord('中')),输出结果是Ɔx4e2d',也就是20013是我们在上文见面了无数次的x4e2d的十进制值。这里说下hex,是用来转换成十六进制的函数,学过单片机的人对hex肯定不会陌生。
最后的扩展,在网上看到的他人的问题。我们写下类似于'u4e2d'的字符,Python3知道我们想表达什么。但是让Python读取某个文件的时候出现了'u4e2d',是不是计算机就不认识它了呢?后来下文有人给出了答案。如下:
importcodecs
file=codecs.open("a.txt","r","unicode-escape")
u=file.read()
print(u)
python123汉字的unicode编码值
python的默认编码是ascii,可以通过sys.setdefaultencoding('utf-8')函数设置python的默认编码。
python中可以通过encode和decode的方式改变数据的编码,比如:
u'汉字'
u'u6c49u5b57'
u'汉字'.encode('utf-8')
'xe6xb1x89xe5xadx97'
u'汉字'.encode('utf-8').decode('utf-8')
u'u6c49u5b57'
我们可以通过这两个函数设置编码。
那么,python中的str是什么类型?
importbinascii
'汉字'
'xbaxbaxd7xd6'
type('汉字')
printbinascii.b2a_hex('汉字')
babad7d6
printbinascii.b2a_hex(u'汉字')
Traceback(mostrecentcalllast):
File"",line1,in
UnicodeEncodeError:'ascii'codeccan'tencodecharactersin
position0-1:ordinalnotinrange(128)
printbinascii.b2a_hex(u'汉字'.encode('utf-8'))
e6b189e5ad97
printbinascii.b2a_hex(u'汉字'.encode('gbk'))
babad7d6
binascii是将数据的二进制转换成ascii,上面的解释是:‘汉字'的类型是str,二进制是babad7d6,u‘汉字'是无法转换成ascii,这样就报出了开头的第一个错误。解决办法就是把它.encode(‘utf-8')成str类型。因为我命令行是windows默认的GBK编码,所有u'汉字'.encode(‘gbk')的时候,输出结果和‘汉字'结果一样。
python程序采用unicode编码,一个中文字符对应几个python程序采用unicode编码,一个中文字符对应两个字节。Unicode编码中,一个英文等于两个字节,一个中文(含繁体)等于两个字节。
结语:以上就是首席CTO笔记为大家整理的关于python中unicode编码有多少的相关内容解答汇总了,希望对您有所帮助!如果解决了您的问题欢迎分享给更多关注此问题的朋友喔~