Python有关Unicode UTF-8 GBK编码问题详解
作者:GokuCode 发布时间:2021-04-01 10:40:13
1.统一码(Unicode)
Unicode也叫万国码、单一码,是计算机科学领域里的一项业界标准,包括字符集、编码方案等。对于世界上所有的语言文字再unicode中都可以查看到。【汉】字的编码解释官网https://www.unicode.org/cgi-bin/GetUnihanData.pl?codepoint=6C49
unicode编码就是为了统一世界上的编码,有一个统一的规范。但是它还存在一些问题。
Unicode的问题
需要注意的是,Unicode只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储。
比如,汉字“严”的unicode是十六进制数4E25,转换成二进制数足足有15位(100111000100101),也就是说这个符号的表示至少需要2个字节。表示其他更大的符号,可能需要3个字节或者4个字节,甚至更多。
这里就有两个严重的问题
第一个:如何才能区别unicode和ascii?计算机怎么知道三个字节表示一个符号,而不是分别表示三个符号呢?
第二个:我们已经知道,英文字母只用一个字节表示就够了,如果unicode统一规定,每个符号用三个或四个字节表示,那么每个英文字母前都必然有二到三个字节是0,这对于存储来说是极大的浪费,文本文件的大小会因此大出二三倍,这是无法接受的。
它们造成的结果是:
出现了unicode的多种存储方式,也就是说有许多种不同的二进制格式,可以用来表示unicode。
unicode在很长一段时间内无法推广,直到互联网的出现。
2.UTF-8编码
互联网的普及,强烈要求出现一种统一的编码方式。UTF-8就是在互联网上使用最广的一种unicode的实现方式。其他实现方式还包括UTF-16和UTF-32,不过在互联网上基本不用。重复一遍,这里的关系是,UTF-8是Unicode的实现方式之一。
UTF-8最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。
UTF-8的编码规则很简单,只有二条:
对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。
对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。
下表总结了编码规则,字母x表示可用编码的位。
Unicode符号范围 | UTF-8编码方式
(十六进制) | (二进制)
--------------------±--------------------------------------------
0000 0000-0000 007F | 0xxxxxxx
0000 0080-0000 07FF | 110xxxxx 10xxxxxx
0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
Python代码举例:
a = '\u6c49' # 汉的unicode编码
print(a)
a = '汉'
print("汉字utf8格式:",a.encode('utf8'))
print('汉字unicode格式:',a.encode('unicode_escape'))
print('汉字gbk格式:',a.encode('gbk'))
print('汉字gb2312格式:',a.encode('gb2312'))
# 输出结果
汉
汉字utf8格式: b'\xe6\xb1\x89'
汉字unicode格式: b'\\u6c49'
汉字gbk格式: b'\xba\xba'
汉字gb2312格式: b'\xba\xba'
可以看到以上结果,汉字的汉通过print打印时用的是unicode编码,存储时使用utf8,也即是我们保存文件时常用的编码
with open('xxx.txt','w',encoding='utf-8') as f:
f.write(xxx)
打开的时候也要指定文件编码
with open(file_path, encoding='utf-8') as f:
f.read()
当使用gbk编码保存的文件使用utf8打开时会报错,使用gbk打开即可
with open(r'gbk.txt','r',encoding='utf8') as f:
print(f.read())
(result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd5 in position 0: invalid continuation byte
来源:https://blog.csdn.net/weixin_44331765/article/details/125077417
猜你喜欢
- 继续List: 删除元素: a =[1, 2, 3, 4] a[2:3] = [] #[1, 2, 4] del a[2] #[1, 2]
- 一、计数排序计数排序(Counting sort)是一种稳定的排序算法算法的步骤如下:找出待排序的数组中最大和最小的元素统计数组中每个值为i
- 在《多进程并发与同步》中介绍了进程创建与信息共享,除此之外python还提供了更方便的进程间通讯方式。进程间通讯multiprocessin
- 本文实例讲述了Python元组 tuple的概念与基本操作。分享给大家供大家参考,具体如下:元组 tuple元组 tuple的定义元组的创建
- 从2015开始国内就开始慢慢接触Python了,从16年开始Python就已经在国内的热度更高了,目前也可以算的上"全民Pytho
- 1._thread.start_new_thread(了解)import threadingimport timeimport _threa
- 目录一、熟悉designer——设计界面的神器1.首先打开designer。2.创建窗口3.熟悉各部功能区域二、设计自己的第一个GUI。1.
- 通过phpmyadmin连接mysql数据库时提示:“2003 无法登录 MySQL服务器”。。。很明显这是没有启动mysql服务,右击我的
- 本文实例讲述了Python3实现对列表按元组指定列进行排序的方法。分享给大家供大家参考,具体如下:Python版本: python3.+ 运
- 在你自己安装了一个新的MySQL服务器后,你需要为MySQL的root用户指定一个目录(缺省无口令),否则如果你忘记这点,你将你的MySQL
- 介绍本篇文章主要介绍如何爬取麦子学院的课程信息(本爬虫仍是单线程爬虫),在开始介绍之前,先来看看结果示意图怎么样,是不是已经跃跃欲试了?首先
- 如下所示:# coding = utf-8import ospath = "D:\\chunyu"#想要重命名所有文件存
- 通过 register_shutdown_function 方法,可以让我们设置一个当执行关闭时可以被调用的另一个函数。也就是说,当我们的脚
- 使用MySQL,安全问题不能不注意。以下是MySQL提示的23个注意事项:1.如果客户端和服务器端的连接需要跨越并通过不可信任的网络,那么就
- 常用当前循环.作用default数据为空时设置默认值length取变量长度filesizeformat文件大小转成可读slice从指定位置到
- 一、用 ftplib 模块连接远程服务器ftplib模块常用方法ftp登陆连接from ftplib import FTP #加
- 本文实例讲述了JavaScript数据结构中串的表示与应用。分享给大家供大家参考,具体如下:类似于线性表的顺序存储结构,用一组地址连续的存储
- 之前整理发表了《XMLHTTPRequest的属性和方法简介》,它ajax要使用的核心的技术之一,现在就来实际运用它。这个Ajax标签导航,
- 本文实例讲述了python使用正则表达式提取网页URL的方法。分享给大家供大家参考。具体实现方法如下:import reimport url
- 一、什么是函数装饰器1.函数装饰器是Python提供的一种增强函数功能的标记函数;2.装饰器是可调用的函数对象,其参数是另一个函数(被装饰的