遇到编码问题,查阅了一些资料,有了一些理解,简单记录下。

首先,Unicode有个通用字符集

其次,每个字符有个编号(编码,即code points),规范为U+hhhh,其中每个h代表一个十六进制数字

最后,有多种实现方式,即一个字符的编号可以用多种方式来表示,例如UTF-8、UTF-16中对同一个字符编号(code point)的表示不一样

1.1 字符集

Unicode的学名是”Universal Multiple-Octet Coded Character Set”,简称为UCS。UCS可以看作是”Unicode Character Set”的缩写。

可以看出,Unicode定义了一个字符集,包括世界上大部分的文字符号。

1.2 Unicode编码

一个字符的Unicode编码是确定的,但是不同实现方式对同一个字符的编码值不一样,所以同一个字符用不同的实现方式编码/解码就会出现乱码。

如果一个仅包含基本7位ASCII字符的Unicode文件,如果每个字符都使用2字节的原Unicode编码传输,其第一字节的8位始终为0。

这就造成了比较大的浪费。对于这种情况,可以使用UTF-8编码,这是一种变长编码,它将基本7位ASCII字符仍用7位编码表示,占用一个字节

(首位补0)。而遇到与其他Unicode字符混合的情况,将按一定算法转换,每个字符使用1-3个字节编码,并利用首位为0或1进行识别。这样对

以7位ASCII字符为主的西文文档就大幅节省了编码长度。

1.3 UTF实现方式

一个字符的Unicode编码是确定的,在实际传输/存储中,出于节省空间的目的,对Unicode编码的实现方式有所不同。

Unicode的实现方式称为Unicode转换格式(Unicode Transformation Format,简称为UTF)。

Unicode的实现方式包括UTF-7、Punycode、CESU-8、SCSU、UTF-32、GB18030等,这些实现方式有些仅在一定的国家和地区使用,有些则

属于未来的规划方式。目前通用的实现方式是UTF-16小端序(LE)、UTF-16大端序(BE)和UTF-8。

2. python编码

2.1 Unicode string

a Unicode string is a sequence of code points, which are numbers from 0 to 0x10ffff.

A code point is an integer value, usually denoted in base 16.

2.2 Encoding

a Unicode string is a sequence of code points, which are numbers from 0 to 0x10ffff.

This sequence needs to be represented as a set of bytes (meaning, values from 0–255) in memory.

The rules for translating a Unicode string into a sequence of bytes are called an encoding.

Python’s default encoding is the ‘ascii’ encoding.

The rules for converting a Unicode string into the ASCII encoding are simple; for each code point:

1. If the code point is < 128, each byte is the same as the value of the code point.

2. If the code point is 128 or greater, the Unicode string can’t be represented in this encoding.

(Python raises a UnicodeEncodeError exception in this case.)

2.3 代码文件的编码

# -*- coding=utf-8 -*- 用来指定.py的源码文件用utf-8规则编码,这样就可以在源码文件中正常显示中文这样的非ASCII字符。

文件的编码表示该文件能表示哪些字符(字符集),比如指定了ASCII那就不能表示中文,因为ASCII字符集中没有中文字符。

2.4 python编码实验

通过前面的知识知道,一个字符的Unicode编码是确定的,即code point是固定的,因此各种字符编码之间的转换可以对标code point进行。

因为任何一个字符,都可以在Unicode编码中(例如UTF-8)对应一个编码(数字),所以不同字符集之间的转换,只要都对应到Unicode中的code point即可完成。

例如要把GBK编码的字符转换成UTF-8编码来保存/传输,可以先转换成Unicode中的编码(code point),然后找到该code point在UTF-8中对应的编码即可。

即 GBK –> Unicode –> UTF-8

GBK –> Unicode 称为解码,即解码成为unicode,Unicode –> UTF-8 称为编码,即编码为UTF-8格式。

所以unicode相当于是明文,GBK、UTF-8相当是各种加密算法,从一种密文(GBK)转换成另一种密文(UTF-8),必须先转换成明文(unicode),再用对应的

加密算法(UTF-8)加密生成对应的密文。

如下实验在secureCRT终端进行,编码设置为UTF-8(相当于在.py文件中设置了 -- coding=utf-8 --),因此可以正常显示中文。

通过sys.getdefaultencoding()得到当前系统默认编码是ascii,python里的str.encode和str.decode不指定时都使用系统默认编码。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96Python 2.6.6 (r266:84292, Jan 22 2014, 01:49:05)

[GCC 4.4.7 20120313 (Red Hat 4.4.7-4)] on linux2

Type "help", "copyright", "credits" or "license" for more information.

>>>

>>> import sys

>>>

>>> sys.getdefaultencoding() # 系统默认编码

'ascii'

>>>

>>> s = u'中国' # unicode类型

>>> type(s)

>>>

>>> s.encode('utf-8').decode('utf-8') # 对unicode调用decode相当于先encode再decode

u'u4e2du56fd'

>>>

>>> s

u'u4e2du56fd' # unicode里"中国"的code point

>>> print(s)

中国

>>>

>>> s.encode('utf-8') # 转换为utf-8编码

'xe4xb8xadxe5x9bxbd' # utf-8中对"中国"的表示

>>>

>>> s.decode() # 对unicode类型调用decode,报错不能encode,因为当前编码是UTF-8,没有显式指定时使用系统默认的ascii,因此报错

Traceback (most recent call last):

File "", line 1, in

UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)

>>>

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

Traceback (most recent call last):

File "", line 1, in

File "/usr/lib64/python2.6/encodings/utf_8.py", line 16, in decode

return codecs.utf_8_decode(input, errors, True)

UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)

>>> s.encode()

Traceback (most recent call last):

File "", line 1, in

UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)

>>>

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

'xe4xb8xadxe5x9bxbd'

>>>

>>> s.encode('utf-8').decode() # 正确encode后又报decode错误,因为当前编码是UTF-8,没有显式指定时使用系统默认的ascii,因此报错

Traceback (most recent call last):

File "", line 1, in

UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128)

>>>

>>> s.encode('utf-8').decode('utf-8') # encode和decode都显式指定后,unicode正确转换为unicode

u'u4e2du56fd'

>>>

>>> s = '中国'

>>> s

'xe4xb8xadxe5x9bxbd'

>>> print(s)

中国

>>> type(s) # str 类型

>>>

>>> s.encode('GBK') # UTF-8 转换为 GBK,需要先解码成unicode,再进行encode编码,但是解码没有显式指定规则,导致使用默认的ascii,解码失败

Traceback (most recent call last):

File "", line 1, in

UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128)

>>>

>>> s.decode() # 不指定密钥和显式指定为ascii报一样的错,说明不指定时使用了默认的ascii

Traceback (most recent call last):

File "", line 1, in

UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128)

>>> s.decode('ascii')

Traceback (most recent call last):

File "", line 1, in

UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128)

>>>

>>> s.decode('gbk')

Traceback (most recent call last):

File "", line 1, in

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

>>>

>>> s.decode('utf-8') # 解码为unicode,指定正确密钥(UTF-8)后成功解码

u'u4e2du56fd'

>>>

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

Traceback (most recent call last):

File "", line 1, in

UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128)

>>>

>>> s.decode('utf-8').encode('utf-8') # UTF-8转换为UTF-8

'xe4xb8xadxe5x9bxbd'

>>>

>>> s.decode('utf-8').encode('GBK') # UTF-8转换为GBK,可以看到GBK和UTF-8对同一个字符的表示编码不一样

'xd6xd0xb9xfa'

>>>

python的unicode编码_python unicode编码相关推荐

  1. 字符编码在python中的处理_python 字符编码处理问题总结

    Python中常常遇到这种字符编码问题,尤其在处理网页源代码时(特别是爬虫中): UnicodeDecodeError: 'XXX' codec can't decode bytes in posit ...

  2. 字符编码在python中的处理_Python 字符编码处理总结

    Python中经常遇到这样那样的字符编码问题,尤其在处理网页源码时(特别是爬虫中): UnicodeDecodeError: 'XXX' codec can't decode bytes in pos ...

  3. python中codecs模块_python自然语言编码转换模块codecs介绍

    python对多国语言的处理是支持的很好的,它可以处理现在任意编码的字符,这里深入的研究一下python对多种不同语言的处理. 有一点需要清楚的是,当python要做编码转换的时候,会借助于内部的编码 ...

  4. python字符串编码_Python字符串编码答疑

    Python 2中的字符串分类 在Python 2中字符串,有两个类型,一个是str,一个是unicode.str可以理解为ASCII的字符列表,说白了,只能存储ASCII字符,如果赋个中文值,会报错 ...

  5. python设置字符编码_python字符编码问题一则

    今天在分析nginx日志的时候,发现用户的请求中有如下格式的字符: \xB6\xF1\xD2\xE2 而大部分用户提交的请求则是如下形式: %E4%BC%98%E8%A1%A3%E5%BA%93 对于 ...

  6. python url编码_python url编码和解码

    一.为什么要进行Url编码 url带参数的请求格式为(举例): http://www.baidu.com/s?k1=v1&k2=v2 当请求数据为字典data = {k1:v1, k2:v2} ...

  7. python unicode编码转换中文_python unicode转中文及转换默认编码

    一. 在爬虫抓取网页信息时常需要将类似"\u4eba\u751f\u82e6\u77ed\uff0cpy\u662f\u5cb8"转换为中文,实际上这是unicode的中文编码.可 ...

  8. python 中文转unicode编码_python实现unicode转中文及转换默认编码的方法

    本文实例讲述了python实现unicode转中文及转换默认编码的方法.分享给大家供大家参考,具体如下: 一.在爬虫抓取网页信息时常需要将类似"\u4eba\u751f\u82e6\u77e ...

  9. python汉字的unicode编码_python解决汉字编码问题:Unicode Decode Error

    前言 最近由于项目需要,需要读取一个含有中文的txt文档,完了还要保存文件.文档之前是由base64编码,导致所有汉字读取显示乱码.项目组把base64废弃之后,先后出现两个错误: ascii cod ...

最新文章

  1. 介绍十种数据恢复的软件工具
  2. DeepLearning tutorial(2)机器学习算法在训练过程中保存参数
  3. js实时监听窗口变化总结
  4. Sitemesh排除Exclude不装饰特定页面的解决办法
  5. 信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言—— 1052:计算邮资
  6. 如何找到SAP Cloud for Customer标准培训和认证方面的信息
  7. linux g命令,【Linux】常用命令大全
  8. linux如何判断同名进程个数,Linux下判断是否存在多个同名进程
  9. 微信在计算机基础中的辅助作用,基于微信课后辅导在计算机基础教学中应用.doc...
  10. 骑行318、 2016.7.7
  11. 规则引擎 drools_网易考拉规则引擎平台架构设计与实践
  12. 小甲鱼python作业百度文库_【小甲鱼python课后题.doc】下载 - 面包树
  13. 详解什么是BT种子、迅雷下载链接、磁力链接
  14. ctex linux安装_Deepin Linux 安装和搭建LaTex环境
  15. 怎么看python帮助手册常见问题商家认证_常见问题(FAQ) - Scrapy 中文文档
  16. C++并发编程 - 同步并发操作
  17. android接入qq广告,QQ接入华为HMS 安卓生态迎巨变?
  18. 从 Exadata 到 TiDB,中通快递 HTAP 实践
  19. 使用EasyExcel完成导出导入功能
  20. eclips的快捷键

热门文章

  1. C语言教你如何做抖音很火的告白编程程序
  2. ICOFormat.8bi(Photoshop Ico、Cur插件)的下载使用——使Photoshop支持ICO图片、CUR图片格式
  3. 亚马逊,shopee,lazada卖家如何组建自己的测评团队
  4. Java-面向对象练习-01
  5. Xamarin技术文档------VS多平台开发
  6. 汕头市队赛 C SRM 05 - YYL 杯 R1 T3!
  7. .cs是什么文件_python自动化能发挥到什么程度,两个有趣的个人案例告诉你
  8. ESP32-CAM搭建Arduino及简单使用
  9. 元组(tuples)
  10. 安装linux系统提示acpi,linux ACPI 知识