字符串的编码集|学习笔记

简介: 字符串的编码集

开发者学堂课程【Python 入门 2020年版字符串的编码集】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/639/detail/10288


字符串的编码集

 

内容简介:

一、字符编码

二、编码规则

 

一、字符编码

1.ASCII → Latin1 → Unicode编码

2.字符 → 数字编码存在一个对应的关系

3.使用内置函数 chr 和 ord 能够查看数字和字符的对应关系

(1)ord 获取字符对应的编码 ; chr 根据编码获取对应的字符

例如:

①print(ord( 'a' ))

运行: 97 (字符对应的编码)

②print(chr(65))

运行: A

③print(ord( '你' ))

运行: 20320

bin(20320) → 0b100111101100000

 

二、编码规则

使用 Unicode为每种语言的每个字符都设定了唯一的二进制编码,但是它还是存在一定的问题,不够完美。

例如,汉字“你" 转换成为一个字符结果是 ex4f6e ,转换成为二进制就是01001111  01100000,此时就有两个问题:

1.1001111(表示一个 Latin1符)  01100000(表示一个 Latin1符)

(1) 你占了两个字节,那么到底是一个汉字“你" , 还是两个 Latin1字符?

(2)假如规定所有的字符都使用16位,2个字节来表示.

例如:

00000000 01001111 → Latin

00000000 01100000 → Latin

以上有两个问题:

①00000000浪费了很多

②不是所有的字符都能用16位表示,可能还不够

例如:

若11100000 1001111 01100000

则: 00000000 00000000 01100000 → Latin

(2) 假如规定所有的字符都使用24位,3个字节来表示,则前面补的0更多,效率、存储的量就加大,也就更麻烦.

(3) 如果 Unicode进行了规定,每个字符都使用 n个八位来表示,对于 Latin1字符来说,又会浪费很多存储空间。

2. 为了解决这个问题,就出现了一些编码规则,按照一定的编码规则对 Unicode数字进行计算,得出新的编码。

在中国常用的字符编码有 GBK(国标扩,一个汉字占两个字节,简体中文),BIG5(繁体中文)和 utf-8(统一编码,一个汉字占三个字节,基本可以编世界上所有的语言)这三种编码规则。

3. 使用字符串的 encode方法,可以将字符串按照指定的编码格式转换称为二进制;使用 decode方法,可以将一个二进制数据按照指定的编码格式转换成为字符串。

例如:

(1)print( '你' , encode( 'gbk' ))

运行: b'\xc4\xe3'

(2)print(0xc4e3)

结果: 50195

①转化为二进制:

bin(0xc4e3)

结果: '0b1100010011100011'

②转化为十进制:

print(0xc4e3)

结果: 50403

(3)print( '你' . encode( 'utf8' ))

运行: b'\xe4\xbd\xa0'

①变回:

x = b'\xe4\xbd\xa0'

print(x.decode( 'utf8' ))

运行: 你

②转化为二进制:

bin(0xe4bda0)

结果: '0b111001001011110110100000'

4.什么叫乱码?

首先创建一个 txt文档,用 Edit with Notepad++软件打开,写一个你好保存,那么文件是以什么编码格式保存,则用 Edit with Notepad++软件打开,就可以看到是使用 UTF-8编码保存的,把你好删除保存,修改编码,点击编码字符集,用中文 GB2312(Simplified)打开,用 UTF-8读,再次在文本框中输入你好,则会出现乱码,当然以下方法也可以验证乱码:

(1)把 '你好' . 使用 gbk编码

①y = '你好' . encode( 'gbk' )

print(y)

运行: b '\xc4\xe3\xba\xc3\'

变回:

print(y. decode( 'gbk' ))

运行: 你好

y = '你好' . encode( 'gbk' )

print(y. decode( 'utf8' ))

报错,当然也不是所有的都会报错

③y = '你好' . encode( 'utf8' ) → utf8一个汉字转换成为三个字节

print(y)

运行: b '\xe4\xbd\xa0\xe5\xa5\xbd'

变回:

print(y. decode( 'gbk' )) →gbk一个汉字占两个字节

运行: 浣犲乀 #之所以会变成这样,是因为把\xe4\xbd转变成了一个字, \xa0\xe5转变成一个字, \xa5\xbd转变成一个字,则此时六个字节就变成了三个字

变回:

In : b'\xe4\xbd\'.decode( 'gbk' )

out : '浣'

print(y.decode( 'utf8' ))

运行:你好

#txt文本乱码,修改字符集,若是用 word则不能用记事本打开,会出现乱码,因为 word不止是我们写的字,它还有很多其他隐藏的特殊的东西.

相关文章
|
JavaScript 数据安全/隐私保护
41 # 编码的问题
41 # 编码的问题
75 0
|
JavaScript 前端开发 Java
Unicode转义(\uXXXX)的编码和解码
  在涉及Web前端开发时, 有时会遇到\uXXXX格式表示的字符, 其中XXXX是16进制数字的字符串表示形式, 在js中这个叫Unicode转义字符, 和\n \r同属于转义字符. 在其他语言中也有类似的, 可能还有其它变形的格式.
2672 0
|
5月前
|
存储
编码
编码。
81 7
|
PHP 数据安全/隐私保护
PHP函数学习:16进制ASCII转化为字符串加密解密
PHP函数学习:16进制ASCII转化为字符串加密解密
275 0
|
开发者 Python
字符串的编码|学习笔记
快速学习字符串的编码
|
机器学习/深度学习 算法 索引
关于Onehot编码的总结
关于Onehot编码的总结
633 0
关于Onehot编码的总结
|
自然语言处理 算法 Java
|
Java
编码小结3
java中编码问题
1296 0