unicode 是 character set

character set 是把每个字符对应成数字的集合,比如unicode中 A对应0041,汉字『我』对应 ‘6211’

unicode 是个很大的集合,几乎覆盖世界上所有的字符,现在的规模已经可以容纳100万个字符。

utf-8 是对 unicode 存储的实现方式

unicode 只定义字符对应的数字,但没有规定这些数字如何存储起来,比如像中文的『我』字存储时需要两个字节来表示,而英文字母A却只需要一个字节,有些其他的字符可能需要3-4个字节。

如果统一规定每个字符用3个或者4个字节来存储,那么每个英文字符都必然需要额外2到3个0,这对存储是很大的浪费。

如果每个字符按照实际需要的字节数来存储,计算机就分不清三个字节是表示三个字符还是一个字符。

utf-8 是对 unicode 编码存储的一种实现方式,同样的还有 utf-16, utf-32。

utf-8 是使用最广泛的编码方式,采用变长的编码方式,可以使用1-4个字节来表示一个字符; utf-16 用2个或4个字节,utf-32 用4个字节表示。编码规则如下:

对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母, UTF-8编码和ASCII码是相同的。

对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。

python2 中的 str 和 unicode

python2 中有字符串类型有两种:byte string (str)和 unicode string (unicode)。

Python

1

2

3

4

5

6

7

8

9

>>> s = '美的'

>>> s

'\xe7\xbe\x8e\xe7\x9a\x84'

>>> s = u'美的'

>>> s

u'\u7f8e\u7684'

>>> s = '美的'

>>> s.decode('utf-8')

u'\u7f8e\u7684'

上面的输出中,第一个s的类型是 str,打印出来的内容是 utf-8 编码过的内容。第二个s的类型是 unicode,打印出来的两个双字节的数字分别表示了两个汉字『美的』。

encode和decode提供 str 和 unicode 这两种的类型的互相转化。

encode 把 unicode 转化成 str(byte string)

decode 把 str(byte string) 转化成 unicode

本质上,str是存放的字节序,有可能是 ascii, gbk, utf-8 等等中的任意一种,通过调用 decode 可以把他们转化成 unicode ,默认的 decode 编码是 ascii 。str中到底是用的哪一种编码,取决于它所在的场景,跟 locale ,文件编码等等都有关系。

文本文件、编辑器的处理

1

2

3

4

5

6

#!/usr/bin/env python

# -*- coding: GBK -*-

s = u'中文'

print repr(s)

print repr(s.encode('GBK'))

比如上面的文件enc.py,保存的时候选择文件编码是GBK,程序文件本质上也是文件,当我们使用某个外部的应用 打开它时(编辑器或者python解释器等),外部应用是不知道该文件的编码格式的,

这个时候有三种情况:

应用使用其默认的编码方式去解析,比如UTF-8或者ASCII;python解释器默认是ASCII,编辑器可以自己设置;

应用根据文件中的字节内容,自动检测编码方式;

文本文件告诉应用使用什么编码方式去解码;比如# -*- coding: GBK -*-告知解释器使用GBK来解码;

试验一下,把# -*- coding: GBK -*-删除后,执行python enc.py,输出:

Python

1

2

File "enc.py", line 4

SyntaxError: Non-ASCII character '\xd6' in file enc.py on line 4, but no encoding declared;

试着用vim打开该文件时,『中文』两个字就会显示成乱码,因为vim默认的文件编码方式被设置成UTF-8了。

1

2

3

4

5

6

7

8

9

10

11

12

#!/usr/bin/env python

# -*- coding: GBK -*-

s1 = u'中文'

print repr(s1)

print repr(s1.encode('GBK'))

s2 = '中文'

print repr(s2)

print repr(s2.decode('GBK'))

输出结果:

Python

1

2

3

4

u'\u4e2d\u6587'

'\xd6\xd0\xce\xc4'

'\xd6\xd0\xce\xc4'

u'\u4e2d\u6587'

从这里可以看出来, s2中存放的是byte格式的从文件中读到的GBK编码的内容。

再看下面的这段代码,程序文件utf8_enc.py,保存成UTF-8编码的。

1

2

3

4

5

6

7

8

9

10

11

12

#!/usr/bin/env python

# -*- coding: utf-8 -*-

s1 = u'中文'

print repr(s1)

print repr(s1.encode('GBK'))

s2 = '中文'

print repr(s2)

print repr(s2.decode('GBK'))

输出:

Python

1

2

3

4

5

6

7

u'\u4e2d\u6587'

'\xd6\xd0\xce\xc4'

'\xe4\xb8\xad\xe6\x96\x87'

Traceback (most recent call last):

File "unicode_enc.py", line 12, in

print repr(s2.decode('GBK'))

UnicodeDecodeError: 'gbk' codec can't decode bytes in position 2-3: illegal multibyte sequence

这里同样可以知道,s2中存放的是文件保存的编码UTF-8的byte码。

References

python中unicode编码表_python unicode 编码整理相关推荐

  1. 【Unicode编码表】UniCode编码表+转化器

    UniCode编码表[转载:https://www.cnblogs.com/csguo/p/7401874.html] Unicode编码则是采用双字节16位来进行编号,可编65536字符,基本上包含 ...

  2. python中unicode编码表_Python中的字符串操作和编码Unicode详解

    本文主要给大家介绍了关于 Python中的字符串操作和编码Unicode的一些知识,下面话不多说,需要的朋友们下面来一起学习吧. 字符串类型 str:Unicode字符串.采用''或者r''构造的字符 ...

  3. unicode编码表_6-字符编码-文件处理

    1.字符编码 1.什么是字符编码人类在于计算机交互时,用的都是人类能读懂的字符,如:中文字符,英文字符,日文字符的等,而计算机只能识别二进制数,详解如下:(进制数即由0和1组成的数字,例如010010 ...

  4. python的unicode编码表_python中Unicode编码初探

    上一篇文章主要讨论了字符编码的不同方式,这一篇文章着重谈谈对python的编码解码的理解. python2 在python2中主要有两种类型的字符类型,一个是str,一个是Unicode.平时我们默认 ...

  5. unicode编码表_关于编码

    编码实质就是0101序列翻译成我们人类能够看懂的东西 ======================== ASCII 用后7位 最后一位保留了 总共128种字符 ASCII的扩展(EASCII):使用了 ...

  6. Unicode 字符编码表|汉字Unicode编码的区间为:0x4E00→0x9FA5

    十进制 十六进制  字符数 编码分类(中文) 编码分类(英文) 起始 终止 起始 终止 (个)     0 127 0000 007F 128 C0控制符及基本拉丁文 C0 Control and B ...

  7. python读取ansi编码文件,如何在Python中同时读取ANSI和Unicode txt文件?

    我是python新手,遇到了一个奇怪的问题: 当一个目录中有50个txt文件时,我希望读取每个.txt文件并将其内容保存在一个唯一的变量中,例如:**file = open(fcf[i], 'r') ...

  8. UniCode编码表,过滤不可见特殊字符

    不可见字符过滤方案 我是在项目中,使用freemarker生成word时,wordxml不能解析不可见字符,导出导出的word报错,不能正常打开. 于是我将freemarker解析后的xml进行了不可 ...

  9. punycode转码以及UniCode编码表参考文章

    Punycode是什么? Punycode是一个根据RFC 3492标准而制定的编码系统,主要用於把域名从地方语言所采用的Unicode编码转换成为可用於DNS系统的编码.Punycode可以防止ID ...

  10. 汉字Unicode编码表(最小值0x4e00,最大值0x952f)

    汉字的unicode编码最小值为:0x4e00,最大值为0x952f 关于 unicode编码表: 1unicode编码表   Unicode目前普遍采用的是UCS-2,它用两个字节来编码一个字符, ...

最新文章

  1. [转载]Array.prototype.slice.call(arguments,1)原理
  2. JMeter 分布式性能测试
  3. 喜茶获美团点评旗下基金4亿元投资!它离行业独角兽还差多远?
  4. 如何选择主机操作系统?
  5. 内置锁的能力不足以满足需求
  6. todo在此放置对话框控件_MFC界面开发进入BCGControlBar v30.5时代,Gantt Chart控件升级...
  7. Linux - xshell上传文件报错乱码
  8. 序号47指标横向展示.xlsx_电力监控系统安全防护规定Akey310参数指标
  9. 安卓线程同步面试_面试BAT大厂,可少不了这些题目!
  10. redis sentinel集群与spring集成
  11. java开闭原则实现代码_向对象的六大原则
  12. 如何成为专家-核心的七个特质
  13. java指数运算_java算法-指数运算(大数运算)
  14. sdn交换机与普通交换机区别—Vecloud
  15. Linux程式设计入门 - fork, pthread, and signals
  16. python爬取下厨房本周受欢迎菜谱
  17. OpenCV 源码中分水岭算法 watershed 函数源码注解
  18. 谷歌标签恢复_避免/从Google惩罚中恢复
  19. 瀚云轩玉石系统瀚云轩玉石竞拍系统开发玩法与开发源码分享
  20. centos7安装boot分区_图文详解centos Linux系统安装教程

热门文章

  1. InnoDB存储引擎的数据存储方式(存储模式)
  2. 为什么勒索软件的预防如此重要?
  3. 学术资源不定期分享-【钱学森《工程控制论》英文原版】
  4. Codejock Xtreme Calendar 最新版下载试用2021版本
  5. TFTP 服务器的配置
  6. 锐起无盘服务器改dns,锐起无盘多配置教程-菜鸟版(老鸟飘过)
  7. linux chmod、chown命令不起作用
  8. C语言实现基数排序 (数据结构 严蔚敏版)
  9. Node.js下载及安装步骤
  10. 播放器市场瞧一瞧: 暴风影音和豪杰解霸前身后世