python汉字编码,python字符编码使用
一、常见编码
ASCII:ASCII码是美国信息交换标准码。由于计算机中的所有信息最后都是二进制值,而且每一位都有0和1两种状态,所以8位可以组合成256种状态,称为一个字节。标准的ASCII码一共规定了128个字符,因为只使用了后7位,第一位统一规定为0。之后,IBM开发了128个扩展字符,这些字符不是标准的ASCII码,而是用来表示边框、音标和其他欧洲非英语字母。
用英语128个符号编码就够了,但表示其他语言就不够了。而且不同国家用的字母也不一样,有的国家用的远远不止256个字符。显然,ASCII不能解决问题。那么有没有统一唯一的编码方式呢?答案是Unicode。
Unicode:Unicode是计算机科学领域的行业标准。Unicode的出现是为了解决传统字符编码方案的局限性。它为每种语言中的每个字符设置了统一的、唯一的二进制代码,以满足跨语言、跨平台的文本转换和处理的要求。
然而,Unicode也有问题。比如“中”的Unicode编码,十六进制是4E2D,也就是二进制的1001100101101占用了15位,也就是说至少需要两个字节来表示这个符号。那么怎么知道这两个词段分别代表的是一个字而不是两个字呢?也就是如何区分Unicode和ASCII。
UTF-8: UTF是“Unicode转换格式”的缩写,可以翻译成Unicode字符集转换格式。UTF-8是互联网上使用最广泛的Unicode实现之一。其他实现包括UTF-16(字符由两个字节或四个字节表示)和UTF-32(字符由四个单词部分表示)。UTF-8的一个特点是它是一种可变长度的编码方法。它可以用1~6个字节来表示一个符号,字节长度根据符号的不同而不同。对于某个字符的UTF-8编码,如果只有一个字节,其最高二进制位为0;如果它是多字节的,它的第一个字节从最高位开始,值为1的连续二进制位数确定编码位数,所有其他字节从10开始。
字节数 UTF 8编码(二进制)
1 0xxxxx
xx
2 110
hestringasabytesobject.Defaultencodingis'utf-8'.errorsmaybegivento
setadifferenterrorhandlingscheme.Thedefaultforerrorsis'strict',meaningthatencodingerrorsraise
aUnicodeError.Otherpossiblevaluesare'ignore','replace','xmlcharrefreplace','backslashreplace'andany
othernameregisteredviacodecs.register_error(),seesectionErrorHandlers.Foralistofpossibleencodings,
seesectionStardardEncodings.
bytes.decode(encoding="utf-8",errors="strict")
Returnastringdecodedfromthegivenbytes.Defaultencodingis'utf-8'.errorsmaybegiventosetadifferent
errorhandlingscheme.Thedefaultforerrorsis'strict',meaningthatencodingerrorsraiseaUnicodeError.
Otherpossiblevaluesare'ignore','replace'andanyothernameregisteredviacodecs.register_error(),see
sectionErrorHandlers.Foralistofpossibleencodings,seesectionStardardEncodings.可以看到str是没有decode方法的,因为本身就是Unicode编码的,而bytes是没有encode方法的,而且无论是encode还是decode默认都是使用UTF-8编码的,当然我们还可以使用其他方式进行编码和解码,比如:
s="博客园"那么对于某个数据来说,如果我们不知道它的编码格式,要怎么办呢?在Python3中可以使用chardet模块里的detect方法查看:print(s.encode())
print(s.encode("utf-16"))
print(s.encode("gbk"))
#b'\xe5\x8d\x9a\xe5\xae\xa2\xe5\x9b\xad'
#b'\xff\xfeZS\xa2[\xedV'
#b'\xb2\xa9\xbf\xcd\xd4\xb0'
importchardetdetect方法会返回一个字典,包含编码方式、检测得到的概率和语言信息。可见,用chardet检测编码,使用简单,获取到编码后,再转换为str,就可以方便后续处理。print(chardet.detect(b'\xe5\x8d\x9a\xe5\xae\xa2\xe5\x9b\xad'))
print(chardet.detect(b'\xff\xfeZS\xa2[\xedV'))
{'encoding':'utf-8','confidence':0.87625,'language':''}
{'encoding':'UTF-16','confidence':1.0,'language':''}
三、文本编码
首先新建一个文本文档“test.txt”,内容为:“博客园Blogs”,然后选择“另存为”,可以看到默认使用的是ANSI编码:
那么这个ANSI编码是什么呢?不同的国家和地区制定了不同的标准,由此产生了GB2312、GBK、Big5、Shift_JIS等各自的编码标准。这些使用1至4个字节来代表一个字符的各种汉字延伸编码方式,称为ANSI编码。而在简体中文Windows操作系统中,ANSI编码就代表GBK编码。那么假如我们使用了默认的ANSI编码即GBK编码,在读取文本的时候会出现什么情况呢?
withopen("test.txt",'r')asf:可以看到使用UTF-8编码打开的时候报错了,原因是有无法解码的字符。那么如果我们保存的时候使用UTF-8编码呢?print(f.read())
#博客园Blogs
withopen("test.txt",'r',encoding="gbk")asf:
print(f.read())
#博客园Blogs
withopen("test.txt",'r',encoding="utf-8")asf:
print(f.read())
UnicodeDecodeError:'utf-8'codeccan'tdecodebyte0xb2inposition0:invalidstartbyte
withopen("test.txt",'r')asf:很明显看到在使用GBK编码时出现乱码了,原因就是编码和解码的方式不一致,导致最终出现了乱码的情况。print(f.read())
#锘垮崥瀹㈠洯Blogs
withopen("test.txt",'r',encoding="gbk")asf:
print(f.read())
#锘垮崥瀹㈠洯Blogs
withopen("test.txt",'r',encoding="utf-8")asf:
print(f.read())
#博客园Blogs
四、URL编码
URL即全球统一资源定位符(Uniform Resource Locator),一般来说,URL只能使用英文字母、阿拉伯数字和某些标点符号,不能使用其他文字和符号,这是因为网络标准RFC1738做出了规定。这意味着,如果URL中有汉字,就必须编码后使用。但是麻烦的是,RFC1738没有规定具体的编码方法,而是交给应用程序(浏览器)自己决定。
这里我们可以任意打开一个网页,比如关于编码的百度百科,可以看到浏览器显示的链接没有什么问题:
复制一下,然后粘贴出来看一下:https://baike.baidu.com/item/%E7%BC%96%E7%A0%81/80092,可以看到“编码”两个字被浏览器自动编码成了“%E7%BC%96%E7%A0%81”。这里我们需要知道的是“编”的UTF-8编码为:E7BC96,“码”的UTF-8编码为:E7A081,因此“%E7%BC%96%E7%A0%81”就是在每个字节前面加上一个“%”得到的,也就是说URL路径使用的是UTF-8编码。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。