Hom's Blog


Python字符串编码问题

字符串实质是字符的一个集合,而字符则以数字形式储存. 最早的计算机在设计时采用8个比特(bit)作为一个字节(byte),所以,一个字节能表示的最大的整数就是255, 两个字节可以表示的最大整数是65535,3个字节最大整数是16711425, 4个字节可以表示的最大整数是4294967295. 三个字节就足够多了…

ASCII

最早只有127个字母被编码到计算机里,也就是大小写英文字母、数字和一些符号,这个编码表被称为ASCII编码,比如大写字母A的编码是65,Z编码90; 小写字母a编码97, z的编码是122。这种编码一个字符只需一个字节, 对于英文字符而言足够了.这也是最基础的字符集.

GB2312等local语言编码

为了解决如汉字等其他语言的编码问题, 出现了如GB2312码等, 用于把中文编进去. 这些编码最少需要两个字节,一般向下兼容ASCII码.

然而.各国有各国的标准,就会不可避免地出现冲突,结果就是,在多语言混合的文本中,显示出来会有乱码。

Unicode

Unicode把所有语言都统一到一套编码里,这样就不会再有乱码问题了, 便于统一使用.Unicode标准在不断发展,但最常用的是用两个字节表示一个字符(如果要用到非常偏僻的字符,就需要4个字节)。现代操作系统和大多数编程语言都直接支持Unicode。Python中unicode的编码字节数取决于编译时环境.

UTF-8

如果统一成Unicode编码,乱码问题从此消失了。但是,如果你写的文本基本上全部是英文的话,用Unicode编码比ASCII编码需要多一倍的存储空间,在存储和传输上就十分不划算。本着节约的精神,又出现了把Unicode编码转化为“可变长编码”的UTF-8编码。UTF-8编码把一个Unicode字符根据不同的数字大小编码成1-6个字节,常用的英文字母被编码成1个字节,汉字通常是3个字节,只有很生僻的字符才会被编码成4-6个字节。如果要传输的文本包含大量英文字符,用UTF-8编码就能节省空间.


  • 在计算机内存中,统一使用Unicode编码,当需要保存到硬盘或者需要传输的时候,就转换为UTF-8编码。
  • 用记事本编辑的时候,从文件读取的UTF-8字符被转换为Unicode字符到内存里,编辑完成后,保存的时候再把Unicode转换为UTF-8保存到文件:

Python的字符串编码

ascii

ord('a') #->97
chr(97) #->a

unicode

unicode.encode和decode是两个unicode字符串的重要方法,可以将其强行转换为别的编码,encode是unicode->other, decode是other-> unicode.

print u"你好!" 
# -> 你好!
u"你好" 
# -> u'\u4f60\u597d'
print unichr(0x4f60)
# -> 你

# unicode to other

u"你好!".encode('utf-8')
# -> '\xe4\xbd\xa0\xe5\xa5\xbd!'
u"你好!".encode('gb2312')
# -> '\xc4\xe3\xba\xc3!'

# other to unicode
print '\xe4\xbd\xa0\xe5\xa5\xbd!'.decode('utf-8')
# -> 你好!

Reference

  1. Unicode-wiki
  2. UTF-8-wiki

本博文已合并到Python语法汇总中, 不再更新.



◆ 本文地址: http://platinhom.github.io/2015/10/17/PyEncode/, 转载请注明 ◆

前一篇: FB电脑端messenger
后一篇: Python:内建函数与对象方法


Contact: Hom / 已阅读()
Source 类别: Coding  标签: Python