1 文本和字节序列

  我们都知道字符串,就是由一些字符组成的序列构成串,那么字符又是什么呢?计算机只能识别二进制的东西,那么计算机又为什么会显示我们的汉字,或者是某个字母呢?

  由于最早发明使用计算机是美国人,他们为了解决了英语如何在电脑上显示,就制定了一套标准:ASCII ((American Standard Code for Information Interchange): 美国信息交换标准代码),主要用于显示现代英语和其他西欧语言。到目前为止共定义了128个字符,从0-127的二进制数分别对应了相应的字符,这样就将现实中的字符和计算机的二进制联系起来,从而将字符表达显示在计算机上。

  随机计算机的普遍,各国有不同的语言,每个国家为了普及计算机的使用,那么如何将各自国家的语言表达在计算机上就成了一个问题。于是,不同的国家都在制定适用自个国家的字符集,比如对于我国来说,就有gbk《汉字内码扩展规范》,它也是将每个字符(字)和计算机的二进制对应起来。那么问题来了,不同的国家使用各自国家的一套规范,在跨国交流时,就会出现文本显示的乱码。于是就有了一套统一的机制Unicode。Unicode(统一码、万国码、单一码),它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。

1.1 字符和字节

  目前使用的基本是Unicode定义的字符,从Python3的str对象中获取的元素就是Unicode字符。字符的具体表述取决于所用的编码。编码是在码位和字节序列之间转换时使用的算法。使用最多的是utf-8编码,使用该编码,文本文件可以跨平台显示。把码位转换成字节序列的过程是编码;把字节转换成码位的过程是解码。

  编码时使用的编码算法要与解码时使用的解码算法相同,要不然会出现乱码的现象。

1.2 字符与字节的转换

  字符是组成字符串有序序列的单个元素,字符可以用上面的编码来理解。字符串按照不同的字符集编码返回字节序列bytes。

  字节序列安装不同的字符集解码返回字符串

1 bytes.decode(encoding="utf-8", errors="strict") -> str
2 bytearray.decode(encoding="utf-8", errors="strict") -> str

1.3 bytes与bytearray

  Python中内置了两种基本的二进制序列类型:Python 3 引入的不可变bytes类型和Python 2.6 增加的可变bytearray类型(字节数组)

1.3.1 bytes定义

  bytes有以下的定义方法:

Definition Function
bytes() 定义空的bytes

bytes(int)

指定字节的bytes,被0填充
bytes(iteeable_of_ints) bytes[0,255]的int组成的可迭代对象
bytes(string, encoding[, errors]) 等价于string.encode()
bytes(bytes_or_buffer)

immutable copy of bytes_or_buffer 从一个字节序列或者buffer复制出
一个新的不可变的bytes对象

使用b前缀定义

只允许基本ASCII使用字符形式b'abc9';

使用16进制表示b"\x41\x61"

1.3.2 bytes操作

  和str类型类似,都是不可变类型,所以很多方法都一样。只不过bytes的方法,输入的是bytes,输出的也是bytes。下面看bytes的基本操作:

  • b'abcdef'.replace(b'f',b'k')
  • b'abc'.find(b'b')  
  • bytes.fromhex(string)  string必须是2个字符的16进制的形式,比如bytes.fromhex('6162 09 6a 6b00'),空格将被忽略
  • 'abc'.encode().hex()  返回16进制表示的字符串
  • b'abcdef'[2]  返回该字节对应的数,int类型

1.3.3 bytearray定义

Definition Function
bytearray() 空bytearray
bytearray(int) 指定字节的bytearray,被0填充
bytearray(iterable_of_ints) bytearray [0,255]的int组成的可迭代对象
bytearray(string, encoding[, errors]) bytearray 近似string.encode(),不过返回可变对象
bytearray(bytes_or_buffer) 从一个字节序列或者buffer复制出一个新的可变的bytearray对象

1.3.4 bytearray操作

  和bytes类型的方法相同:

  • bytearray(b'abcdef').replace(b'f',b'k')
  • bytearray(b'abc').find(b'b')
  • bytearray.fromhex('6162 09 6a 6b00')
  • bytearray('abc'.encode()).hex()
  • bytearray(b'abcdef')[2]  返回该字节对应的数,int类型

  bytearray是字节型的数组,相当于列表一样,只不过bytearray中存储的是字节形式的序列。它也支持和列表一些相同的操作:

Python中字符的编码与解码的更多相关文章

  1. Python中进行Base64编码和解码

    Base64编码 广泛应用于MIME协议,作为电子邮件的传输编码,生成的编码可逆,后一两位可能有“=”,生成的编码都是ascii字符.优点:速度快,ascii字符,肉眼不可理解缺点:编码比较长,非常容 ...

  2. python中的URL编码和解码

    python中的URL编码和解码:test.py # 引入urllib的request模块 import urllib.request url = 'https://www.douban.com/j/ ...

  3. python中字符串的编码和解码

    1. 常用的编码 ASCII:只能表示一些字母,数字和特殊的字符,占一个字节 GBK:国家简体中文字符集和繁体字符集,兼容ASCII,占两个字节 Unicode:能够表示全世界上所有的字符,Unico ...

  4. python的str,unicode对象的encode和decode方法, Python中字符编码的总结和对比bytes和str

    python_2.x_unicode_to_str.py a = u"中文字符"; a.encode("GBK"); #打印: '\xd6\xd0\xce\xc ...

  5. 使用 URLDecoder 和 URLEncoder 对中文字符进行编码和解码

    原文: https://blog.csdn.net/justloveyou_/article/details/57156039 使用 URLDecoder 和 URLEncoder 对中文字符进行编码 ...

  6. Python之字符与编码笔记

    概述 类型 str 字符串 bytes 字节 bytearray 字节数组 字符串编码架构 字符集:赋值一个编码到某个字符,以便在内存中表示 编码 Ecoding:转换字符到原始字节形式 解码 Dec ...

  7. java中URL 的编码和解码函数

    java中URL 的编码和解码函数java.net.URLEncoder.encode(String s)和java.net.URLDecoder.decode(String s);在javascri ...

  8. 如何在Python 中使用UTF-8 编码 && Python 使用 注释,Python ,UTF-8 编码 , Python 注释

    如何在Python 中使用UTF-8 编码 && Python 使用 注释,Python ,UTF-8 编码 , Python  注释 PIP $ pip install beauti ...

  9. python中字符编码及unicode和utf-8区别

    ascii和unicode是字符集,utf-8是编码集 字符集:为每一个「字符」分配一个唯一的 ID(学名为码位 / 码点 / Code Point) 编码规则:将「码位」转换为字节序列的规则(编码/ ...

随机推荐

  1. 设计模式-工厂模式(Factory)(创建型模式)

    以下代码来源: 设计模式精解-GoF 23种设计模式解析附C++实现源码 //Product.h #pragma once class Product { public: ; protected: P ...

  2. ReactNative: 使用Image图片组件

    一.简介 在应用程序中,图片组件非常常见,不论是缩略图.大图.还是小图标等等,都需要使用图片组件进行显示.在Web开发中提供了<img/>标签显示图片,在iOS中提供了UIImageVie ...

  3. Docker 系列之 常用镜像

    Ubuntu 实战 操作 # 拉取 18.04 版本的 Ubuntu 镜像 docker pull ubuntu:latest # 以交互方式运行并进入 ubuntu 容器环境 docker run ...

  4. 分布式应用监控: SkyWalking 快速接入实践

    分布式应用,会存在各种问题.而要解决这些难题,除了要应用自己做一些监控埋点外,还应该有一些外围的系统进行主动探测,主动发现. APM工具就是干这活的,SkyWalking 是国人开源的一款优秀的APM ...

  5. navicat 12激活

    激活软件:https://github.com/DoubleLabyrinth/navicat-keygen/releases 激活说明:https://github.com/DoubleLabyri ...

  6. ES6-数字操作,判断是否是整数,判断最大值最小值

    S中只有一种类型数,即64位(1bit 的符号位,11bits 的指数部分 ,以及52bits 的小数部分)双精度浮点数,当整数数值过大时,就会发生精度丢失. 所谓安全整数即能够唯一确定的数字,即能够 ...

  7. 利用Azure虚拟机安装Dynamics 365 Customer Engagement之八:安装报表扩展及最新更新

    我是微软Dynamics 365 & Power Platform方面的工程师罗勇,也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面 ...

  8. 微信小程序——仿jqueryValidate表单验证插件WxValidate的二次封装(一)

    在做web开发时,表单验证插件我们前端用的是jqueryValidate,由于个人主要精力是在后台JAVA开发上,为了让插件与后台更好的结合和使用,通过JAVA的自定义组件将表单全部重新写了一边,同时 ...

  9. 剑指offer 21:包含min函数的栈

    题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1)). 解题思路 要求在O(1)时间内完成,由于栈后进先出的原则,不能出现破坏栈结构的事情.因 ...

  10. SpringBoot高版本修改为低版本时测试类报错解决

    有时在使用idea通过Spring Initailizr创建项目时,默认只能创建最近的版本的SpringBoot项目. 这是如果想要换成版本,就可以在项目创建好了之后,在pom文件中直接将版本修改过来 ...