Python之字符编码汇总

一、常见编码

ASCII:ASCII码即美国标准信息交换码(American Standard Code for Information Interchange)。由于计算机内部所有信息最终都是一个二进制值,而每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256种状态,这被称为一个字节(byte)。标准ASCII 码一共规定了128个字符的编码,这是因为只使用了后面七位,最前面的一位统一规定为0。之后IBM制定了128个扩充字符,这些字符并非标准的ASCII码,而是用来表示框线、音标和其它欧洲非英语系的字母。

英语用128个符号编码就够了,但是用来表示其他语言,128个符号是不够的,而且不同的国家使用不同的字母,有的国家使用的字符也远远超过256个,显然ASCII已经无法解决问题了。那么有没有一种统一且唯一的编码方式呢?答案就是Unicode。

Unicode:Unicode是计算机科学领域里的一项业界标准,Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。

但是Unicode也是有问题的,比如“中”字的Unicode编码是十六进制的4E2D,即二进制的100111000101101占15位,也就是说表示这个符号至少需要两个字节,那么怎么知道这两个字节是表示一个字符而不是分别表示两个字符呢?也就是如何区分Unicode和ASCII?

UTF-8:UTF是“Unicode Transformation Format”的缩写,可以翻译成Unicode字符集转换格式。UTF-8 就是在互联网上使用最广的一种Unicode的实现方式,其他实现方式还包括UTF-16(字符用两个字节或四个字节表示)和UTF-32(字符用四个字节表示)。UTF-8一个特点,就是它是一种变长的编码方式。它可以使用1~6个字节表示一个符号,根据不同的符号而变化字节长度。对于某一个字符的UTF-8编码,如果只有一个字节则其最高二进制位为0;如果是多字节,其第一个字节从最高位开始,连续的二进制位值为1的个数决定了其编码的位数,其余各字节均以10开头。

字节数   |  UTF-8编码(二进制)

 1       |    0xxxxxxx 

 2       |    110xxxxx 10xxxxxx

   3       |    1110xxxx 10xxxxxx 10xxxxxx 

   4       |    11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 

   5       |    111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 

   6       |    1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

很明显对于“中”字使用UTF-8编码需要使用三个字节,因此从“中”字的最后一个二进制位开始,依次从后向前填入格式中的x,多出的位补0。这样就得到了“中”字的UTF-8编码,结果为:11100100 10111000 10101101,即十六进制的E4B8AD。

二、Python3编码

Python中的编码问题困扰了我挺久的,尤其是Python2和Python3中还有区别,不过这里我只讨论Python3中的编码问题。

Python3最重要的新特性大概要算是对文本和二进制数据作了更为清晰的区分,文本总是Unicode,由str类型表示,二进制数据则由bytes类型表示,而两者之间的转换由编码(encode)和解码(decode)实现。这里可以看一下Python的官方文档:

str.encode(encoding="utf-8", errors="strict")
  Return an encoded version of the string as a bytes object. Default encoding is 'utf-8'. errors may be given to 
  set a different error handling scheme. The default for errors is 'strict', meaning that encoding errors raise 
  a UnicodeError. Other possible values are 'ignore', 'replace', 'xmlcharrefreplace', 'backslashreplace' and any 
  other name registered via  codecs.register_error(), see section Error Handlers. For a list of possible encodings, 
  see section Stardard Encodings.
 
bytes.decode(encoding="utf-8", errors="strict")
  Return a string decoded from the given bytes. Default encoding is 'utf-8'. errors may be given to set a different 
  error handling scheme. The default for errors is 'strict', meaning that encoding errors raise a UnicodeError. 
  Other possible values are 'ignore', 'replace' and any other name registered via codecs.register_error(), see 
  section Error Handlers. For a list of possible encodings, see section Stardard Encodings.

可以看到str是没有decode方法的,因为本身就是Unicode编码的,而bytes是没有encode方法的,而且无论是encode还是decode默认都是使用UTF-8编码的,当然我们还可以使用其他方式进行编码和解码,比如:

s = "博客园"
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'

那么对于某个数据来说,如果我们不知道它的编码格式,要怎么办呢?在Python3中可以使用chardet模块里的detect方法查看:

import chardet
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': ''}

detect方法会返回一个字典,包含编码方式、检测得到的概率和语言信息。可见,用chardet检测编码,使用简单,获取到编码后,再转换为str,就可以方便后续处理。

三、文本编码

首先新建一个文本文档“test.txt”,内容为:“博客园Blogs”,然后选择“另存为”,可以看到默认使用的是ANSI编码:

1562145029869156.png

那么这个ANSI编码是什么呢?不同的国家和地区制定了不同的标准,由此产生了GB2312、GBK、Big5、Shift_JIS等各自的编码标准。这些使用1至4个字节来代表一个字符的各种汉字延伸编码方式,称为ANSI编码。而在简体中文Windows操作系统中,ANSI编码就代表GBK编码。那么假如我们使用了默认的ANSI编码即GBK编码,在读取文本的时候会出现什么情况呢?

with open("test.txt", 'r') as f:
    print(f.read())
# 博客园Blogs
with open("test.txt", 'r', encoding="gbk") as f:
    print(f.read())
# 博客园Blogs
with open("test.txt", 'r', encoding="utf-8") as f:
    print(f.read())
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb2 in position 0: invalid start byte

可以看到使用UTF-8编码打开的时候报错了,原因是有无法解码的字符。那么如果我们保存的时候使用UTF-8编码呢?

with open("test.txt", 'r') as f:
    print(f.read())
# 锘垮崥瀹㈠洯Blogs
with open("test.txt", 'r', encoding="gbk") as f:
    print(f.read())
# 锘垮崥瀹㈠洯Blogs
with open("test.txt", 'r', encoding="utf-8") as f:
    print(f.read())
# 博客园Blogs

很明显看到在使用GBK编码时出现乱码了,原因就是编码和解码的方式不一致,导致最终出现了乱码的情况。

四、URL编码

URL即全球统一资源定位符(Uniform Resource Locator),一般来说,URL只能使用英文字母、阿拉伯数字和某些标点符号,不能使用其他文字和符号,这是因为网络标准RFC1738做出了规定。这意味着,如果URL中有汉字,就必须编码后使用。但是麻烦的是,RFC1738没有规定具体的编码方法,而是交给应用程序(浏览器)自己决定。

这里我们可以任意打开一个网页,比如关于编码的百度百科,可以看到浏览器显示的链接没有什么问题:

x.png

复制一下,然后粘贴出来看一下: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编码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/288222.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

gookit/color - Go语言命令行色彩使用库教程

gookit/color - Go语言命令行色彩使用库教程 1.安装2.基础颜色(16-color)3.256色彩/RGB风格 1.安装 go get github.com/gookit/color2.基础颜色(16-color) 提供通用的API方法:Print Printf Println Sprint Sprintf 1、例如: color.Yellow.Println(&q…

centos7 ping不通域名

如果ip能ping通,ping不通域名可以试试以下操作: 1.编辑resolv.conf文件 vi /etc/resolv.conf 添加 nameserver 8.8.8.8 2.编辑nsswitch.conf vi /etc/nsswitch.conf 改成下图所示: 3.编辑sysctl.conf vi /etc/sysctl.conf 加上两行内…

macOS跨进程通信: FIFO(有名管道) 创建实例

一: 简介 在类linux系统中管道分为有名管道和匿名管道。两者都能单方向的跨进程通信。 匿名管道(pipe): 必须是父子进程之间,而且子进程只能由父进程fork() 出来的,才能继承父进程的管道句柄,一般mac 开发…

1分钟生成爆款风景视频,Stable Video Diffusion最简教程

AI视频是2024年的重头戏,各大AI厂商都在跑视频技术,快速推出更牛的黑科技,SD其实在11月底就出了一款官方视频大模型-SVD,来跟runway、pika抢这块大蛋糕。 之前生成的视频效果还不是很理想,远没runway效果好&#xff0c…

【Mybatis】深入学习MyBatis:高级特性与Spring整合

🍎个人博客:个人主页 🏆个人专栏: Mybatis ⛳️ 功不唐捐,玉汝于成 目录 前言 正文 高级特性 1 一级缓存和二级缓存 一级缓存 二级缓存 2 延迟加载 5 整合Spring 1 MyBatis-Spring模块 2 事务管理 结…

如何在Windows安装Wnmp服务并实现固定地址远程访问

文章目录 前言1.Wnmp下载安装2.Wnmp设置3.安装cpolar内网穿透3.1 注册账号3.2 下载cpolar客户端3.3 登录cpolar web ui管理界面3.4 创建公网地址 4.固定公网地址访问 前言 WNMP是Windows系统下的绿色NginxMysqlPHP环境集成套件包,安装完成后即可得到一个Nginx MyS…

无辅源电压继电器 RWY-D2/3 180-440VAC 导轨安装 josef约瑟

RWY-D1型电压继电器; RWY-D2型电压继电器; 一、 概述 RWY-D系列电压继电器(以下简称本继电器)用于发电机、变压器和输电线的电器保护装置中,作为过电压保护或低电压闭锁的启动原件。本继电器为集成电路静态型继电器…

用户管理第2节课 -- idea 2023.2 创建表--鱼皮

二、【先确定idea版本&鱼皮是否一致,再决定看不看这行】建表 2.1 idea 里连接数据库,通过可视化建表 2.1.1 清空表中数据 的 命令 truncate 清空 2.1.2 先输入删除表,的命令,再选中这行命令,执行,…

Linux学习之系统编程2(关于进程及其相关的函数)

写在前面: 我的Linux的学习之路非常坎坷。第一次学习Linux是在大一下的开学没多久,结果因为不会安装VMware就无疾而终了,可以说是没开始就失败了。第二次学习Linux是在大一下快放暑假(那个时候刚刚过完考试周)&#xf…

k8s快速搭建

VMware16Pro虚拟机安装教程VMware16.1.2安装及各版本密钥CentOS7.4的安装包:提取码:lp6qVMware搭建Centos7虚拟机教程 搭建完一个镜像 关机 拍摄一个快照,克隆两个作为子节点 0. 环境准备 在开始之前,部署Kubernetes集群机器需要满足以下几个条件&#…

实验三-HBase数据库操作

第一步:首先登陆ssh,之前设置了无密码登陆,因此这里不需要密码;再切换目录至/usr/local/hadoop ;再启动hadoop ssh localhost cd /usr/local/hadoop ./sbin/start-dfs.sh 输入命令jps,能看到NameNode,Data…

环境准备-VMware安装

照顾到很多人不是很会环境搭建,我这里会将搭建的步骤讲的细致点 第一步,VMware下载。目的是通过VMware搭建Linux服务器,因为大家大部分还是Windows的电脑,我们先下载虚拟机搭建一个Linux系统的服务器 下载完成之后,点击安装,如下: 点击“下一步” 勾选“我接受许可协议…

算法导论复习——CHP24 单源最短路

单源最短路径问题: 给定一个图G (V,E),找出从给定的源点s∈V到其它每个结点v∈V的最短路径。 这样最短路径具有最优子结构性:两个结点之间的最短路径的任何子路径都是最短的。 基本概念 负权边:权重为负值的边称为负权重的边。 如…

AI计算,为什么要用GPU?

今天这篇文章,我们继续来聊聊芯片。 在之前的文章里,小枣君说过,行业里通常会把半导体芯片分为数字芯片和模拟芯片。其中,数字芯片的市场规模占比较大,达到70%左右。 数字芯片,还可以进一步细分&#xff0…

工具分享:有哪些开源知识库可以使用?

导语: 在信息爆炸的时代,我们常常需要从各种渠道获取知识和解决问题。开源知识库为我们提供了一个便捷的途径,让我们可以轻松地分享和获取知识。本文将介绍5个开源知识库,其中包括HelpLook,帮助你更好地解决问题。 1…

Nacos 持久化及集群的搭建【微服务】

文章目录 一、统一配置管理二、微服务配置拉取三、配置热更新四、多环境共享配置五、Nacos 集群搭建1. 集群结构2. 初始化数据库3. 搭建集群 六、Nginx 反向代理七、启动项目测试 一、统一配置管理 案例练习的时候我们只有两个微服务,管理起来非常简单,但…

8个超高清图片素材网站,免费下载,真的很实用~

图片真的是我们日常生活中必不可少的一部分,大到工作,小到发朋友圈都需要配图,那除了自己拍摄之外,哪里还能找到精美又高清的图片素材呢?本期就给大家整理了8个可免费下载的图片素材网站,真的免费下载&…

大创项目推荐 深度学习动物识别 - 卷积神经网络 机器视觉 图像识别

文章目录 0 前言1 背景2 算法原理2.1 动物识别方法概况2.2 常用的网络模型2.2.1 B-CNN2.2.2 SSD 3 SSD动物目标检测流程4 实现效果5 部分相关代码5.1 数据预处理5.2 构建卷积神经网络5.3 tensorflow计算图可视化5.4 网络模型训练5.5 对猫狗图像进行2分类 6 最后 0 前言 &#…

揭秘VVIC API接口:引领数据交互新潮流,赋能开发者无限可能

一、引言 VVIC API接口为开发者提供了一种高效、安全的方式,用于获取VVIC平台上的各类数据和服务。通过该接口,开发者可以将VVIC的丰富资源集成到自己的应用或网站中,从而为用户提供更加优质和便捷的服务。 二、VVIC API接口的种类与功能 …

Vue - 多行文本“展开、收起”功能

TextClamp 使用 js 实现文本展开、收起,并非纯 CSS 实现。 Props: fontSize:Number,默认:14lines:Number,默认:1lineHeight:Number,默认:20 F…