python字符串编码

常见字符编码类型

ASCII:美国信息交换标准码,是目前计算机中最广泛使用的字符集编码。每个 ASCII 码以 1 个字节
存储,例如数字字符 0 的 ASCII 码是 0110000,十进制表示为 48。
Unicode:为解决世界上上百种语言带来混合、冲突,各国有各国的标准,显示很容易出现乱码。
Unicode 就出现了,它把所有语言的字符都统一到一套 Unicode 编码中,并定义每个语言字符的标
准,所以 Unicode 又称统一码,万国码。大部分编程语言都支持 Unicode, Python 内部编码也支持
Unicode。
GB2312:中国国家标准总局发布处理汉字的标准编码。
GBK: GB2312 的扩展,向下兼容 GB2312。
UTF-8:针对 Unicode 的可变长度字符编码,又称万国码。支持中文简体繁体及其它语言(如英文,

日文,韩文)。


decode()

decode()函数作用是将其他编码(比如 ACSII、 Byte String)的字符串解码成 Unicode。

encode()

encode()函数作用是将 Unicode 编码成终端软件能是识别的编码,就能正常显示了,比如 UTF-8、

GBK。

Python 编码处理
#!/usr/bin/env python
c = "中文"
print c
# python test.py
File "test.py", line 2
SyntaxError: Non-ASCII character '\xe4' in file test.py on line 3, but no encoding
declared; see http://www.python.org/peps/pep-0263.html for details
在程序里面直接打印中文,会报语法错误,这是因为 Python 默认编码是 ASCII,无法处理其他编
码。
如果想打印中文,需要声明编码为 utf-8,上面也有写过:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
c = "中文"
print c
print type(c)
# python test.py
中文
<type 'str'>
可以正常输出中文了,类型是字符串,这个字符串是经过 Python unicode 编码后字节组成的。
虽然可以正常输入中文,并不意味的就万事大吉了,如果终端编码不是 utf-8 或其他软件也不确定
编码还会出现乱码情况。所以还是要明白 Python 处理编码逻辑关系,才能更好的应对编码问题。

切换到交互式解释器:

>>> c = "中文"
>>> c.encode('utf-8')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in
range(128)
如果直接转成 utf-8 是不允许的,报错 Unicode 解码错误,大概意思是说 ascii 码不能解码字节字
符串。
上面讲到 encode()函数作用是将 Unicode 码解码,而现在的 c 变量并非是 Unicode 码,而是字节字
符串,
算是 Unicode 的一种吧?。
故此,不能使用 encode(),而是先使用 decode()先解码陈 Unicode 再用 encode()编码成 utf-8
>>> c.decode('utf-8')
u'\u4e2d\u6587' # 4e2d 对应 unicode 值是"中", 6587 对应 unicdoe 值是"文"
>>> type(c.decode('utf-8'))

<type 'unicode'>
>>> print c.decode('utf-8') ?
中文
>>> print c.decode('utf-8').encode('utf-8')
中文
如果是 Unicode 字符串可直接通过 encode()函数转码其他编码。
>>> c = u'中文'
>>> c.encode('utf-8')
'\xe4\xb8\xad\xe6\x96\x87'
>>> print c.encode('utf-8')
中文
看下字节字符串和 unicode 字符串区别:
>>> c = '中文'
>>> u = u'中文'
>>> c
'\xe4\xb8\xad\xe6\x96\x87'
>>> u
u'\u4e2d\u6587'
>>> len(c)
6
>>> len(u)
2
字节字符串长度要比 unicode 长的多,而 unicode 长度就是字符长度。
总结下: Python 处理编码流程大致是这样的, ascii --> decode() --> unicode --> encode() -
-> 终端能识别的编码, unicode 算是一个中间码,有着承上启下的作用。







  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值