广告
返回顶部
首页 > 资讯 > 后端开发 > Python >字符编码学习笔记
  • 758
分享到

字符编码学习笔记

学习笔记字符 2023-01-31 00:01:32 758人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

一、常见编码 ASCII:ASCII码即美国标准信息交换码(American Standard Code for InfORMation Interchange)。由于计算机内部所有信息最终都是一个二进制值,而每一个二进制位(bit)有0

一、常见编码

ASCII:ASCII码即美国标准信息交换码(American Standard Code for InfORMatioInterchange)。由于计算机内部所有信息最终都是一个二进制值,而每一个二进制位(bit)有01两种状态,因此八个二进制位就可以组合出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编码:

那么这个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没有规定具体的编码方法,而是交给应用程序(浏览器)自己决定。

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

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

 

--结束END--

本文标题: 字符编码学习笔记

本文链接: https://www.lsjlt.com/news/181903.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 字符编码学习笔记
    一、常见编码 ASCII:ASCII码即美国标准信息交换码(American Standard Code for Information Interchange)。由于计算机内部所有信息最终都是一个二进制值,而每一个二进制位(bit)有0...
    99+
    2023-01-31
    学习笔记 字符
  • MySQL学习笔记(8):字符集
    本文更新于2019-06-16,使用MySQL 5.7,操作系统为Deepin 15.4。 目录常用字符集MySQL字符集 常用字符集 字符集 定长 代码宽度 说明 ASCII或ISO-646 是 1字节7位 英文字...
    99+
    2019-08-14
    MySQL学习笔记(8):字符集
  • Python学习笔记1—Python字符
        字符串是python中重要的数据对象    python字符串是以单引号、双引号、或者三个三单引号三个双引号包含的任意的python数据对象都可以称为python字符串    注意:以单引号或双引号包含的数据对象中间不可以换行(若需...
    99+
    2023-01-31
    学习笔记 字符 Python
  • python学习笔记字符串(二)
    字符串类型(string)字符串是以单引号'或双引号"括起来的任意文本,比如'abc',"123"等等。请注意,''或""本身只是一种表示方式,不是字符串的一部分,因此,字符串'abc'只有a,b,c这3个字符。如果'本身也是一个字符,那就...
    99+
    2023-01-31
    字符串 学习笔记 python
  • Redis 学习笔记(一) 字符串 SDS
    SDS 简单动态字符串。 SDS的结构: struct sdshdr{ int len;//记录BUF数组中已使用字节的数量 ,等于SDS所八寸字符串的长度 int free;//记录BUF数组中未使用字节的数量 char ...
    99+
    2016-03-29
    Redis 学习笔记(一) 字符串 SDS
  • python学习笔记3:转义字符
    本文列出python中的转义字符,以方便项目参考 转义字符 描述 \(在行尾时) 续行符 \\ 反斜杠符号 \' 单引号 \" 双引号 \a 响铃 \b 退格(Backspace) \e 转义 \00...
    99+
    2023-01-31
    学习笔记 字符 python
  • Java编程思想学习笔记2 - 字节流和字符流
    《Thinking in Java》第18章的内容是相当丰富精彩的,也在网络学习参考了很多前辈们的笔记,个人由于能力有限(毕竟和大神Bruce Eckel的能力相差甚远),将这一章的内容分三个部分来写,希望能够慢慢品味和领悟Java IO的...
    99+
    2023-06-02
  • java学习笔记_关于字符串概述
    一、String类String类代表字符串,是由字符构成的一个序列。创建String对象的方法很简单,有以下几种:1)用new来创建:String s1 = new String("my name is tongye");...
    99+
    2023-05-31
    java 字符串 ava
  • python学习笔记:字典
     python版本:Python 2.6.6   系统环境:CentOS release 6.2 x86_64   本文参考了互联网上前辈的一些文章   一、字典是python中最灵活的内置数据结构类型,如果把列表看作是有序的对象集合,那么...
    99+
    2023-01-31
    字典 学习笔记 python
  • JAVA编程学习笔记
    常用代码、特定函数、复杂概念、特定功能……在学习编程的过程中你会记录下哪些内容?快来分享你的笔记,一起切磋进步吧! 一、常用代码 在java编程中常用需要储备的就是工具类。包括封装的时间工具类。htt...
    99+
    2023-09-03
    java 学习 笔记
  • 【代码】Django学习笔记
      一些设置setting.py DEBUG = True ALLOWED_HOSTS = ['*'] DATABASES = { 'default': { 'ENGINE': 'django.db.backe...
    99+
    2023-01-31
    学习笔记 代码 Django
  • Python学习笔记---代码
    1.Python基础语法 转自菜鸟教学:https://www.runoob.com/python 1.1 简单执行命令print("Hello,Python!)" 1.2 脚本文件添加可执行权限 $chmod +x test.py ...
    99+
    2023-01-31
    学习笔记 代码 Python
  • Redis学习笔记(三) 字典
    Redis的字典使用哈希表作为底层实现,一个哈希表中可以有多个哈希表节点,而每个哈希节点就保存在字典中的一个键值对。 redis字典所用的哈希表由disht结构定义。 typedef struct dictht{ dic...
    99+
    2014-05-20
    Redis学习笔记(三) 字典
  • Python学习笔记(四)——数字
    数字 在Python中,数字并不是一个真正的对象类型,而是一组类似类型的分类。Python不仅支持通常的数据类型(整数和浮点数。),而且能够通过常量去直接创建数字以及处理数字的表达式。  整数和浮点数 复数 固定精度的十进...
    99+
    2023-01-31
    学习笔记 数字 Python
  • MySQL学习笔记(5):运算符
    本文更新于2020-06-14,使用MySQL 5.7,操作系统为Deepin 15.4。 目录算数运算符比较运算符逻辑运算符位运算符运算符优先级 算数运算符 运算符 语法 说明 + a + b 加法 - a -...
    99+
    2021-06-02
    MySQL学习笔记(5):运算符
  • Python运算符(Python学习笔记
    ...
    99+
    2023-01-30
    学习笔记 运算符 Python
  • Redisbook学习笔记(1)字典(3
    渐进式rehash在上一节,我们了解了字典的rehash 过程,需要特别指出的是,rehash 程序并不是在激活之后就马上执行直到完成的,而是分多次、渐进式地完成的。假设这样一个场景:在一个有很多键值对的字典里,某个用户在添加新键值对时触发...
    99+
    2023-01-31
    字典 学习笔记 Redisbook
  • 学习笔记-TP5框架学习笔记\(路由\)
    TP5框架简单理解 (PS:只做粗略、关键知识的记录,TP程序的开始。详情请阅读官方手册) 1. 架构总览 TP程序的开始 PHP >=5.3.0, PHP7 ThinkPHP5.0应用基于MVC(模型-视图-控制器)的方...
    99+
    2023-10-25
    学习 php 开发语言
  • String类的学习笔记(下):字符串拼接以及StringBuilder和StringBuffer的学习
    本文介绍了String类对字符串进行拼接的方法 和拼接字符串的效率分析 以及能对字符串内容进行修改的StringBuilder和StringBuffer类其常用方法和区别 , 最后介绍了两个字符串经典面试题 StringBuil...
    99+
    2023-08-25
    学习 笔记 java
  • linux shell编程学习笔记(3)
    1、什么是变量保存变化的数据——变量名:名称固定,由系统预设或用户自定义——变量值:根据用户设置、系统环境变化而变化2、如何定义变量——变量名=变量的值2.1变量名的规则(1)数字、字母、下划线(2)字母区分大小写(3)当变量名相同时,后赋...
    99+
    2023-01-31
    学习笔记 linux shell
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作