关于编码的问题(二)Python字符串

背景

今天上了一节数据挖掘的实验课,使用的编程语言是Python,不过我是个Python小白。今天老师给的代码里在一个字符串前面加了英文字母u,如u‘abc’。我是真的疑惑死了,第一次见,对,我是个小白,哈哈。查了一些资料,发现和编码有关,但是不想懂个一知半解,于是,请看下面,开始了。

这个你肯定看得懂

在最新的Python 3版本中,字符串是以Unicode编码的。

print('z张1')
//z张1

接下来我们强行用UTF-8编码看看

'123a张'.encode('utf-8')
//b'123a\xe5\xbc\xa0'

看这个输出是以b开头的,说明这是一段bytes。(bytes的作用请看下去)有没有想起在前面说过的utf-8是向下兼容ASCII码的?你看输出中的英文Unicode和English就被原样输出,而ASCII码不能识别的中文,则用utf-8编码方式来表示,如\xe8,\xbf等等

关于字节

由于Python的字符串类型是str,在内存中以Unicode表示一个字符对应若干个字节如果要在网络上传输,或者保存到磁盘上,就需要把str变为以字节为单位的bytes

要注意区分’ABC’和b’ABC’,前者是str,后者虽然内容显示得和前者一样,但bytes的每个字符都只占用一个字节

编码

>>> 'ABC'.encode('ascii')
b'ABC'
>>> '中文'.encode('utf-8')
b'\xe4\xb8\xad\xe6\x96\x87'
>>> '中文'.encode('ascii')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)

解码

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

len函数

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

可见,1个中文字符经过UTF-8编码后通常会占用3个字节,而1个英文字符只占用1个字节。

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

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

# -*- coding: utf-8 -*-
#只是告诉了python按UTF-8编码读取,并不意味着保存的时候是UTF-8编码。

其实我之前还是有点迷糊那个开头说的u的问题,刚coding完终于明白了。

**默认情况下,Python 3是将字符串存储为Unicode,而如果Python 2要将字符串存储为Unicode,则要求使用“u”标记字符串。**Unicode字符串比ASCII字符串更通用,它们都是Python 2的默认字符串,因为它们可以存储来自外语的字母以及表情符号和标准的罗马字母和数字。如果要确保Python 3代码与Python 2兼容,你仍然可以使用“u”来标记Unicode字符串。

因为我是个python小白,没发现我们老师上课给的代码是python2的,哈哈搞懂了。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值