python字符串编码

字符编码

字符串是一种数据类型,字符串比较特殊的一个问题是字符编码。

常见编码

ASCII编码:美国发明,最早只有127个字符被编码到计算机,只有英文、数字和一些符号;

GB2312编码:中国发明,中文至少需要两个字节,这个编码把中文加了进去;

这样的话日本把日文编码到Shift_JIS中,韩国把韩文编码到Eur-JIS中,在读取的时候就会产生乱码的现象,于是产生了Unicode编码。

Unicode编码:把所有语言统一到同一套编码中,就不会出现乱码现象。常用两个字节编码一个字符。在对英文编码的时候,只需要编码前面补0就可以。

乱码的问题解决了,但是如果字符串全部是英文的话,用Unicode编码会有些不划算,于是产生了可变长的UTF-8编码。

UTF-8编码:可变长编码,把原Unicode字符根据不同数字大小编码成1-6个字节,常用的英文通常是 1 个字节,中文通常是 3 个字节,只有很生僻的字才会被编码为 4-6 个字节。如果传输的大量英文文本,UTF-8就可以大量节约存储空间。ASCII 可以被视为UTF-8的一部分

在计算机内存中,统一使用Unicode编码,当需要保存到硬盘或者需要传输的时候,就转换为UTF-8编码。
用记事本编辑的时候,从文件读取的UTF-8字符被转换为Unicode字符到内存里,编辑完成后,保存的时候再把Unicode转换为UTF-8保存到文件:
在这里插入图片描述
浏览网页的时候,服务器会把动态生成的Unicode内容转换为UTF-8再传输到浏览器:
在这里插入图片描述

python 字符串

在python 3 中,字符是以Unicode编码的。

python ord() 函数: 将字符用整数表示; chr() 函数:将整数编码转换为对应的字符。

python 中字符串类型是str,在内存中用Unicode编码,当需要读取到网页或者保存到磁盘的时候,会转换为字节为单位的bytes。python对bytes类型以‘b’为前缀的单引号或者双引号表示。虽然 str 类型和 bytes 类型输出都是一样的,但是 bytes 只占用一个字节。

x = b'ABC'

encode()

用 unicode 表示的 str 通过encode 可以编码为指定的 bytes 类型。在bytes中,无法显示为ASCII字符的字节,用**\x##**显示。

>>> 'ABC'.encode('ascii')
b'ABC'
>>> '中文'.encode('utf-8')
b'\xe4\xb8\xad\xe6\x96\x87'

decode()

从网络或者磁盘读取的字节流,那么读取到的就是 bytes 类型,通过 decode 方法可以把 bytes 转换为 str。

>>> b'ABC'.decode('ascii')
'ABC'
>>> b'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8')
'中文'

如果bytes中包含无法解码的字节,decode()方法会报错:

>>> b'\xe4\xb8\xad\xff'.decode('utf-8')
Traceback (most recent call last):
  ...
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 3: invalid start byte

如果bytes中只有一小部分无效的字节,可以传入errors='ignore’忽略错误的字节:

>>> b'\xe4\xb8\xad\xff'.decode('utf-8', errors='ignore')
'中'

len()

len()函数计算的是str的字符数,如果换成bytes,len()函数就计算字节数:

>>> len('ABC')
3
>>> len('中文')
2
>>> len(b'ABC')  # 一个英文只占一个字节
3
>>> len(b'\xe4\xb8\xad\xe6\x96\x87')  
6
>>> len('中文'.encode('utf-8'))  # 一个中文占3个字节
6

在操作字符串时,我们经常遇到str和bytes的互相转换。为了避免乱码问题,应当始终坚持使用UTF-8编码对str和bytes进行转换。

由于Python源代码也是一个文本文件,所以,当你的源代码中包含中文的时候,在保存源代码时,就需要务必指定保存为UTF-8编码。当Python解释器读取源代码时,为了让它按UTF-8编码读取,我们通常在文件开头写上这两行:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

第一行注释是为了告诉linux/OS X系统这是一个python可执行程序,window系统会忽略它。
第二行注释是为了告诉解释器,这个文件是按照UTF-8编码,否则,当文件中出现中文时,可能会乱码。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值