Python中编码和字符串

编码和字符串

编码

在学习回顾中总结一下ASCII编码、Unicode编码和utf-8编码。

计算机中只能处理数字,我们若要处理文本的话就要将文件转换为数字。所以,这就涉及该怎样转换的问题,也就是编码问题。

在计算机中使用8个比特(bit)作为一个字节(byte),一个字节最大的表示范围是255(从0开始),意味着一个字节最多表示256个字符,表示更多的字符需要更多的字节。

ASCII编码

因为计算机是美国人发明的,所以最早就只有127个字符被编码到计算机中。127个字符包括大小写英文字母、数字和一些符号。这个编码也被称为ASCII编码。在ASCII码表中记录着127个字符所对应的十六进制和十进制等信息。

附一张ASCII码表的截图。

Unicode编码

见名知意,Unicode编码的意思就应该是统一编码之意。早期计算机刚诞生之时只做军队和大学研究之用不算普遍,可是后面发展迅速,在很多国家都在广泛使用计算机。为了能让各个国家统一处理语言编码问题就需要一种统一的编码,最开始的ASCII编码仅能表示256个字符远远不能满足需求,所以就产生了Unicode编码。

Unicode编码最常用的是两个字节表示一个字符(如果是非常偏僻的字符则需要四个字节)

utf-8

实际上,Unicode的实现方式不同于编码方式。一个字符的Unicode编码是确定的。但是在实际传输过程中,由于不同系统平台的设计不一致,以及出于节省空间的目的,对Unicode编码的实现方式会有所不同。Unicode的实现方式称为Unicode转换格式(Unicode Transformation Format,简称为UTF)

如果一个仅包含基本7位ASCII字符的Unicode文件,如果每个字符都使用2字节的原Unicode编码传输,其第一字节的8位始终为0。这就造成了比较大的浪费。对于这种情况,可以使用UTF-8编码,这是一种变长编码,UTF-8编码把一个Unicode字符根据不同的数字大小编码成1-6个字节,常用的英文字母被编码成1个字节,汉字通常是3个字节,只有很生僻的字符才会被编码成4-6个字节。

因此,如果你要传输的文本包含大量英文字符,用UTF-8编码就能节省空间。

字符串

在Python3中,文本是Unicode编码,由str类型表示,二进制数据则由bytes类型表示。

需要注意Python对bytes类型数据用带b前缀的单引号或双引号表示如:x=b‘time‘

当数据保存在磁盘上或者在网络上传输时,我们需要将str类型数据转换为二进制数据类型bytes。

以Unicode表示的str可以通过encode()方法编码为指定的bytes

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

以上可以也证明中文编码不能用ascii编码

如果我们从网络或磁盘上读取了字节流,那么读到的数据就是bytes。要把bytes变为str,就需要用decode()方法。

当然,bytes中可能包含无法解码的字节,这时decode()方法会报错,如果bytes中只有一小部分无效的字节,可以传入errors=‘ignore‘忽略错误的字节

>>> b‘ABC‘.decode(‘ascii‘)
‘ABC‘
>>> b‘\xe4\xb8\xad\xe6\x96\x87‘.decode(‘utf-8‘)
‘中文‘
>>> b‘\xe4\xb8\xad\xff‘.decode(‘utf-8‘)
Traceback (most recent call last):
  File "<input>", line 1, in <module>
UnicodeDecodeError: ‘utf-8‘ codec can‘t decode byte 0xff in position 3: invalid start byte
>>> b‘\xe4\xb8\xad\xff‘.decode(‘utf-8‘,errors=‘ignore‘)
‘中‘

还有一点需要注意一下,len()函数计算的是str的字符数,如果换成bytes,len()函数就计算字节数

>>> len(‘中文‘.encode(‘utf-8‘))
6
>>> len(‘中文‘)
2

原文地址:https://www.cnblogs.com/myworld7/p/8449607.html

时间: 2024-10-08 21:57:33

Python中编码和字符串的相关文章

python中编码总结:

python中编码总结: 1 python默认使用程序文件的编码对中文字符串进行编码,所以utf-8 .gbk程序的记录的中文是不同的编码 2 可以强制使用unicode编码进行编码,使用u字符 str = u'中文字符' 3. utf-8 每个中文占用3个字节 \xe8\x80\x83 4  gbk 每个中文占用2个字节  \xbf\xbc 5 编码介绍 编码规则 UTF-8编码:一个英文字符等于一个字节,一个中文(含繁体)等于三个字节 Unicode编码:一个英文等于两个字节,一个中文(含繁

python中文和unicode字符串之间的互相转换

首先:中文->unicode字符串 import chardet import codecs >>> a = "我是一个中国人">>> a'\xce\xd2\xca\xc7\xd2\xbb\xb8\xf6\xd6\xd0\xb9\xfa\xc8\xcb' >>> chardet.detect(a){'confidence': 0.99, 'encoding': 'GB2312'}>>> b = a.decod

Python中编码的详细讲解

看这篇文章前,你应该已经知道了为什么有编码,以及编码的种类情况 ASCII 占1个字节,只支持英文 GB2312 占2个字节,支持6700+汉字 GBK GB2312的升级版,支持21000+汉字 Shift-JIS 日本字符 ks_c_5601-1987 韩国编码 TIS-620 泰国编码 由于每个国家都有自己的字符,所以其对应关系也涵盖了自己国家的字符,但是以上编码都存在局限性,即:仅涵盖本国字符,无其他国家字符的对应关系.应运而生出现了万国码,他涵盖了全球所有的文字和二进制的对应关系, U

Python中的raw字符串和多行字符串

1.raw字符串(原始字符串) 如果一个字符串包含很多需要转义的字符,对每一个字符都进行转义会很麻烦.为了避免这种情况, 我们可以在字符串前面加个前缀r,表示这是一个 raw 字符串,里面的字符就不需要转义了.例如: r'\(^_^)/ \(~_~)/' raw字符串表示原始字符串,我对于原始的理解就是:你看到这个字符串是什么就显示什么,去掉 所有字符都不进行转义,该显示啥就是啥. 2.多行显示 Python中除了可以使用单引号' '.双引号" "表示一个字符串,还可以使用三引号来表示

理解Python中编码的应用

完全理解字符编码 与 Python 的渊源前,我们有必要把一些基础概念弄清楚,虽然有些概念我们每天都在接触甚至在使用它,但并不一定真正理解它.比如:字节.字符.字符集.字符码.字符编码. 字节 字节(Byte)是一个抽象出来的计算机测量单位.8个0和1组成的二进制数据称为1个字节(1Byte=8bits).字节是计算机中数据存储的基本单元. 计算机中的所有数据,不论是保存在磁盘文件上的还是网络上传输的数据(文字.图片.视频.音频文件)都是由字节组成的 字符 字符(Character)也是一个抽象

python中编码和解码decode和encode的使用

python 在处理字符串时经常遇到编码错误,导致乱码,且python 2.x和 python 3.x之间有很大的不同,先在这里记录一下,以后整理; 转载 文章一篇: http://www.cnblogs.com/evening/archive/2012/04/19/2457440.html

Python中如何将字符串作为变量名

应用场景描述: 通过配置文件获取服务器上配置的服务名及运行端口号,编写python脚本检测服务上服务是否在运行? #!/usr/bin/env python # -*- coding:utf-8 -*-# fileName: config.py # 服务配置 class config: serviceList = 'service1,service2,service3' service1 = '服务1' service1Port = 8001 service2 = '服务2' service2P

python中列表、字符串、字典的常用操作

列表操作如此下: a = ["haha","xixi","baba"]增:a.append[gg]a.insert[1,gg] 在下标为1的地方,新增 gg删:a.remove(haha) 删除列表中从左往右,第一个匹配到的 hahadel a.[0] 删除下标为0 对应的值a.pop(0) 括号里不写内容,默认删除最后一个,写了,就删除对应下标的内容改:a.[0] = "gg"查:a[0]a.index("haha

python中列表元组字符串相互转换

python中有三个内建函数:列表,元组和字符串,他们之间的互相转换使用三个函数,str(),tuple()和list(),具体示例如下所示: >>> s = "xxxxx" >>> list(s) ['x', 'x', 'x', 'x', 'x'] >>> tuple(s) ('x', 'x', 'x', 'x', 'x') >>> tuple(list(s)) ('x', 'x', 'x', 'x', 'x')