python2.x编码Unicode字符串

1 python2.x编码Unicode字符串

python2.x默认编码方法为ASCII码。字符串赋值时按系统默认编码自动编码,通过decode()方法解码为Unicode,再通过encode()方法编码为指定码。

1.1 编码解码基础知识

1.1.1 位

位(bit)是计算机存储数据的最小单位,每一个位存储一个二进制(0或1)。

1.1.2 字节

字节是计算机计算存储容量的一种计量单位。

字节为数据存储单位,位为数据传输单位。

一个字节(Byte)等于8位(bit)二进制。一个位表示1个二进制的0或1。

计算机的数据以字节的形式存储处理。

1.1.3 字符

字符是各种文字和符号的总称,包括字母、数字、各国文字、标点符号、图形符号、运算符、特殊符号和其他符号。

字符是数据结构中最小的数据存取单位。任何一个文字或符号都是一个字符。

1.1.4 编码字符集

把字符映射到数字的表格,称为编码字符集(Character Set),微软称其为代码页(Code Page),也叫内码。

字符集的每个字符都对应一个唯一的十进制代码值,称为码点(码值)(Code Point),是字符在编码字符集中的编号。

所以编码字符集(Character Set)是所有字符以及对应码点的集合,即编码字符集规定了字符与码点的对应关系。

本文编码字符集简称为字符集。比如,ASCII字符集、GBK字符集、Unicode字符集。

比如,ASCII码字符集中的字符a,对应的码值就是97。

1.1.5 字符编码方式

将字符集中字符的十进制代码值转换为实际存储字节系列的映射规则,称为字符编码方式。

比如,ASCII字符编码、GBK字符编码、Unicode字符编码。

1.1.6 字符集与字符编码方式

NO字符集字符编码方式
1ASCII字符集ASCII字符编码
2GBK字符集GBK字符编码
3Unicode字符集UTF-8字符编码
4UTF-16字符编码
5UTF-32字符编码

1.1.7 字符编码

字符是有不同意义的文字和符号,而计算机只能识别0和1二进制组成的字节,所以要确保字符与字节之间能相互转换,计算机才能存储和处理字符。

字符编码就是把字符转为字节,从字节提取字符的规则。

编码:按照指定字符编码方式找到字符对应的字节。

解码:按照指定字符编码方式找到字节对应的字符。

字符在计算机中存储与读取:

存储:字符->字符集->码值->字符编码方式->二进制->存储。

读取:二进制->字符编码方式->码值->字符集->字符->显示。

1.1.8 标准ASCII字符集

标准ASCII码点范围[0,127],只需7位二进制即可覆盖。使用一个字节存储一个字符,首位是0。

1.1.9 GBK字符集

GBK中一个中文字符编码成两个字节,一个英文字符编码成一个字节。

计算机解码‘我a你’时,如何区分一次要解析一个字节还是两个字节?

GBK规定,汉字的第一个字节的第1位必须是1。

‘我a你’GBK编码如下:

1xxxxxxx xxxxxxxx|0xxxxxxx|1xxxxxxx xxxxxxxx

计算机解码时,计算机判断第1字节的第1位,如果为1,则为汉字,一次解析2个字节,如果为0,则为ACII字符,一次解析1个字节。前提:字节必须完整,不能部分截取。

1.1.10 Unicode字符集

Unicode字符集,也叫万国码。

(1) UTF-16编码,每个字符编码为2或4字节。

(2) UTF-32编码,每个字符编码为4字节,1个汉字占2个字节。

(3) UTF-8编码,可变长编码,每个字符编码为1或2或3或4字节,1个汉字占3个字节。

计算机用UTF-8解码时,如何区分要解析1个字节、或2个字节、或3个字节还是4个字节?

(1)第1位为0,则解析1个字节,1个字符占1个字节,

(2)第1位非0,前3位为110,则解析2个字节,舍去前缀110和10,剩余位组成二进制,1个字符占2个字节,

(3)第1位非0,前4位为1110,则解析3个字节,舍去前缀1110、10、10,剩余位组成二进制,1个字符占3个字节,

(4)第1位非0,前5位为11110,则解析4个字节,舍去前缀11110、10、10、10,剩余位组成二进制,1个字符占4个字节,

1.2 查看编码方式

描述

python通过sys和locale查看解释器和系统编码方式。

示例

>>> import sys
>>> import locale
# python解释器默认编码方式
>>> sys.getdefaultencoding()
'ascii'
# 文件系统编码方式
>>> sys.getfilesystemencoding()
'mbcs'
# 终端输入编码方式
>>> sys.stdin.encoding
'cp936'
# 终端输出编码方式
>>> sys.stdout.encoding
'cp936'
# 当前操作系统编码方式
#当前操作系统的默认语言环境是zh_CN(简体中文),默认字符集是cp936(GBK编码)。
>>> locale.getdefaultlocale()
('zh_CN', 'cp936')

1.3 python2.x字符串

python2.x字符串赋值,c=’梯’为字节串,使用系统默认编码方式进行编码后赋值给c。

python2.x通过u’s’创建unicode文本,为宽字符文本。

1.3.1 ‘s’创建字符串自动编码

描述

python2.x通过s=’xxx’创建的字符串常量为字节串,会自动根据系统默认编码方式进行编码。

示例

>>> import locale;import sys
# locale.getdefaultlocale() 获取系统默认编码方式 为cp936
# sys.getdefaultencoding() 获取py解释器编码方式
>>> locale.getdefaultlocale();sys.getdefaultencoding()
('zh_CN', 'cp936')
'ascii'
>>> c='梯'
# c存放的是字节串,是根据系统默认编码方式编码后的字节串
>>> c
'\xcc\xdd'
# 通过's'.decode('编码方式')进行解码,获取 对应 Unicode 字符
# 解码的编码方式 需与 编码时的系统默认编码方式 cp936 一致
>>> c.decode('cp936')
u'\u68af'
# python2.x通过u's'获得unicode字符
>>> u'梯'
u'\u68af'

1.3.2 u’s’创建unicode对象

描述

python2.x通过u’s’创建unicode文本,为宽字符文本。unicode对象可以进行encode()编码。

NO项目py2.xpy3.x
1u’s’,unicode常量创建unicode字符串创建str字符串
2‘s’,字符串常量创建str字符串,按系统默认编码方式进行编码,类型为str,实际为字节串,可以直接进行decode()解码为unicode。创建str字符串
3len(‘梯’)1个汉字, 按gbk编码时,2个字节,长度2, 按utf-8编码是,3个字节,长度3, 1个字节为2位16进制长度1
4len(u’梯’)长度1长度1

示例

# idle py2.7
>>> import sys
>>> sys.version.split(' ')[0]
'2.7.18'
>>> u1,c1=u'梯','梯'
# py2.x u's'创建unicode类型
>>> tuple(map(type,(u1,c1)))
(<type 'unicode'>, <type 'str'>)
# u1-unicode常量,以u开头,用\u转义
# c1-字符串常量,用2位16进制表示1个字节,用\x转义
>>> u1,c1
(u'\u68af', '\xcc\xdd')
>>> tuple(map(len,(u1,c1)))
(1, 2)
# python2.x 字符串常量按系统默认编码方式自动编码
>>> c_gbk='梯'
>>> u=c_gbk.decode('gbk')
>>> c_utf8=u.encode('utf-8')
>>> c_gbk,u,c_utf8
('\xcc\xdd', u'\u68af', '\xe6\xa2\xaf')
# 1个汉字,gbk编码占2个字节,utf-8编码占3个字节,unicode字符集占1个字节
>>> tuple(map(len,(c_gbk,u,c_utf8)))
(2, 1, 3)# idle py3.7
>>> import sys
>>> sys.version.split(' ')[0]
'3.7.8'
>>> u1,c1=u'梯','梯'
# py3.x u's'创建 str 类型
>>> tuple(map(type,(u1,c1)))
(<class 'str'>, <class 'str'>)
>>> u1,c1
('梯', '梯')
>>> tuple(map(len,(u1,c1)))
(1, 1)

1.4 python2.x的编码和解码

描述

python2.x创建str字符串赋值时,会根据当前系统的默认编码方式自动编码,所以,字符串实际已经是字节串了,此时需要用相同的编码方式进行解码为Unicode,再对Unicode按照指定的编码方式进行encode编码。

python2.x解释器的默认编码方法为ASCII编码,通过sys**.getdefaultencoding()**查看。

字符串赋值使用的编码方式为当前系统的默认编码方式,

通过locale**.getdefaultlocale()**查看。

赋值:自动编码;解码为Unicode,再按指定编码方法编码。

编码:encode(),解码:decode()。
在这里插入图片描述
在这里插入图片描述

示例

# python2.x 字符串常量按系统默认编码方式自动编码
>>> c_gbk='梯'
# 对字节串按指定编码方法解码为unicode
>>> u=c_gbk.decode('gbk')
# 对unicode按指定编码方法编码,gbk解码后编码为utf-8
>>> c_utf8=u.encode('utf-8')
>>> for x in (c_gbk,u,c_utf8):print x,
梯 梯 梯
# python3.x 字符串赋值后为unicode字符串
>>> c='梯'
>>> c_gbk=c.encode('gbk')
>>> c,c_gbk
('梯', b'\xcc\xdd')
>>> c_utf8=c_gbk.decode('gbk').encode('utf-8')
>>> c,c_gbk,c_utf8
('梯', b'\xcc\xdd', b'\xe6\xa2\xaf')
>>> tuple(map(len,(c,c_gbk,c_utf8)))
(1, 2, 3)
>>> tuple(map(type,(c,c_gbk,c_utf8)))
(<class 'str'>, <class 'bytes'>, <class 'bytes'>)

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

数据之光:乡镇企业的发展利器——数据可视化

数据可视化是一项强大的工具&#xff0c;它不仅在大型企业中发挥关键作用&#xff0c;而且在乡镇企业中也能作出显著贡献。那么&#xff0c;数据可视化究竟能为乡镇企业做出什么样的贡献呢&#xff1f; 首先&#xff0c;数据可视化为乡镇企业提供了更清晰的业务洞察。通过将庞大…

超简单实用,推荐的深度学习科研必备网站(轻松找论文,代码项目,写论文综述)

一个非常有用的深度学习必备网站 网址推荐 接触新方向需要了解的内容1.在某一个研究方向下&#xff0c;有哪些算法模型可以用&#xff1f;不同算法之间效果对比如何&#xff1f;2.在某一个研究方向下&#xff0c;到底有哪些论文&#xff0c;模型是可以用的&#xff1f;3.在某一…

Python中如何使用_new_实现单例模式

单例模式是一个经典设计模式&#xff0c;简要的说&#xff0c;一个类的单例模式就是它只能被实例化一次&#xff0c;实例变量在第一次实例化时就已经固定。 在Python中常见的单例模式有None&#xff0c;这就是一个很典型的设计&#xff0c;通常使用 if xxx is None或者if xxx …

ESP32S3+HX8347+3线SPI运行LVGL例程

一、clone lv_port_esp32到本地 git clone https://github.com/lvgl/lv_port_esp32.git 二、增加hx8347.c、hx8347.h components\lvgl_esp32_drivers\lvgl_tft下新增2个文件&#xff1a;hx8347.c、hx8347.h。因为lv_port_esp32中没有hx8347的驱动&#xff0c;需要自己写。这两个…

分库分表之Mycat应用学习二

3 Mycat 概念与配置 官网 http://www.mycat.io/ Mycat 概要介绍 https://github.com/MyCATApache/Mycat-Server 入门指南 https://github.com/MyCATApache/Mycat-doc/tree/master/%E5%85%A5%E9%97%A8%E6%8C%87%E5%8D%973.1 Mycat 介绍与核心概念 3.1.1 基本介绍 历史&#x…

怎么使用FTP

FTP服务器&#xff08;File Transfer Protocol Server&#xff09;是在互联网上提供文件存储和访问服务的计算机&#xff0c;它们依照FTP协议提供服务。FTP是File Transfer Protocol的缩写&#xff0c;即文件传输协议&#xff0c;是一种基于TCP的协议&#xff0c;采用客户/服务…

软件测试/测试开发丨Python 数据类 dataclass 学习笔记

dataclass 介绍 dataclass优势 可读性强操作灵活轻量 应用场景 创建对象完美融合平台开发 ORM 框架 案例 场景&#xff1a;如果创建一只猫&#xff0c;信息包括猫的名字、体重、颜色。同时打印这个对象的时候&#xff0c;希望能打印出一个字符串&#xff08;包含猫的各种信息&…

Python跨年烟花秀

写在前面 今年跨年怎么过呢~博主用python的pygame实现了一场炫酷的烟花秀&#xff0c;一起来看看吧&#xff01; 环境需求 python3.11.4及以上PyCharm Community Edition 2023.2.5pyinstaller6.2.0&#xff08;可选&#xff0c;这个库用于打包&#xff0c;使程序没有python环境…

图灵日记之java奇妙历险记--继承和多态

目录 继承概念继承语法父类成员访问子类中访问父类的成员变量子类中访问父类的成员方法 super关键字子类构造方法super和this初始化protected关键字继承方式final 关键字继承与组合 多态条件向上转型重写动态绑定&&静态绑定多态再理解向下转型多态的优缺点好处缺陷 继承…

【Transformer】深入理解Transformer模型2——深入认识理解(下)

前言 Transformer模型出自论文&#xff1a;《Attention is All You Need》 2017年 近年来&#xff0c;在自然语言处理领域和图像处理领域&#xff0c;Transformer模型都受到了极为广泛的关注&#xff0c;很多模型中都用到了Transformer或者是Transformer模型的变体&#xff0…

java springboot宠物医院管理系统

一.项目简介 宠物医院管理系统&#xff0c;java项目&#xff0c;springboot项目。eclipse和idea都能打开运行。 使用技术&#xff1a;springboot&#xff0c;mybatis&#xff0c;jsp&#xff0c;mysql 5.7 共分为三个角色&#xff1a;系统管理员、医生、用户 功能模块&…

9. 进程

9. 进程 1. 进程与程序1.1 main() 函数由谁调用1.2 程序如何结束1.2.1 注册进程终止处理函数 atexit() 1.3 何为进程1.4 进程号 2. 进程的环境变量2.1 应用程序中获取环境变量2.1.1 获取指定环境变量 2.2 添加/删除/修改环境变量2.2.1 putenv()2.2.2 setenv()2.2.3 命令行式添加…

springboot参数校验常用注解及分组校验

一、使用方式添加Validated 二、常见注解 Null 被注解的元素必须为null NotNull 被注解的元素必须不为null NotBlank 只能作用在接收的 String 类型上&#xff0c;注意是只能&#xff0c;不能为 null&#xff0c;而且调用 trim() 后&#xff0c;长度必须大于 0即&#xff…

在 Linux 中使用 cat 命令

cat 命令用于打印文本文件的文件内容。至少&#xff0c;大多数 Linux 用户都是这么做的&#xff0c;而且没有什么问题。 cat 实际上代表 “连接(concatenate)”&#xff0c;创建它是为了 合并文本文件。但只要有一个参数&#xff0c;它就会打印文件内容。因此&#xff0c;它是用…

【数据结构】双向带头循环链表的实现

前言&#xff1a;在前面我们学习了顺序表、单向链表&#xff0c;今天我们在单链表的基础上进一步来模拟实现一个带头双向链表。 &#x1f496; 博主CSDN主页:卫卫卫的个人主页 &#x1f49e; &#x1f449; 专栏分类:数据结构 &#x1f448; &#x1f4af;代码仓库:卫卫周大胖的…

软件测试/测试开发丨Python 内置库 正则表达式re

什么是正则表达式 正则表达式就是记录文本规则的代码可以查找操作符合某些复杂规则的字符串 使用场景 处理字符串处理日志 在 python 中使用正则表达式 把正则表达式作为模式字符串正则表达式可以使用原生字符串来表示原生字符串需要在字符串前方加上 rstring # 匹配字符…

基于Java学生成绩管理系统设计与实现(源码+部署文档+报告)

博主介绍&#xff1a; ✌至今服务客户已经1000、专注于Java技术领域、项目定制、技术答疑、开发工具、毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精彩专栏 推荐订阅 &#x1f447;&#x1f3fb; 不然下次找不到 Java项目精品实…

结构体:是第几天

今天是该年的第几天 #include<iostream> using namespace std; struct Date //创建结构体 {int year; //年int month; //月int day; //日 }; void inputDate(Date *p) //输入函数 {cin >> p->year >> p->month >> p->day; //输入年、月、…

C++内联函数与引用(超详细)

文章目录 前言一、内联函数1.为什么会存在内联函数2.什么是内联函数3.内联函数注意事项 二、引用1.什么是引用2.引用的特性3.常引用4.引用使用场景5.引用与指针 总结 前言 一、内联函数 1.为什么会存在内联函数 &#x1f9d0;&#x1f9d0;首先我们介绍内联函数之前&#xf…

记一次JSF异步调用引起的接口可用率降低 | 京东云技术团队

前言 本文记录了由于JSF异步调用超时引起的接口可用率降低问题的排查过程&#xff0c;主要介绍了排查思路和JSF异步调用的流程&#xff0c;希望可以帮助大家了解JSF的异步调用原理以及提供一些问题排查思路。本文分析的JSF源码是基于JSF 1,7.5-HOTFIX-T6版本。 起因 问题背景…