python输出⽂字乱码_字符串编码及Python字符串编码字符与字节有什么区别
1、字符与字节有什么区别
(⼀)字节
⽹络传输。1 byte=8 bit (KB,M)
存储和⽹络传输。
字节(Byte)是⼀种计量单位,表⽰数据量多少,主要⽤于存储
(⼆)字符
字符是指计算机中使⽤的⽂字和符号,⽐如1、2、3、A、B、C、~!·#¥%……
(三)“字节”与“字符”
不同编码⾥,字符和字节的对应关系不同:
它们完全不是⼀个位⾯的概念
完全不是⼀个位⾯的概念,不同编码⾥,字符和字节的对应关系不同:
①ASCII
⼀个中⽂汉字占两个字节的空间。⼀个⼆进制数字序列,在计算机中作ASCII码中,⼀个英⽂字母(不分⼤⼩写)占⼀个字节的空间,⼀个中⽂汉字占两个字节
为⼀个数字单元,⼀般为8位⼆进制数,换算为⼗进制。最⼩值0,最⼤值255。
②UTF-8编码中,⼀个英⽂字符=⼀个字节,⼀个中⽂(含繁体)=三个字节。
⼀个英⽂字符=⼀个字节,⼀个中⽂(含繁体)=三个字节。
③Unicodepython格式化输出format
⼀个英⽂等于=两字节,⼀个中⽂(含繁体)=两个字节。
Unicode编码中,⼀个英⽂等于=两字节,⼀个中⽂(含繁体)=两个字节。
符号:英⽂标点占⼀个字节,中⽂标点占两个字节。举例:英⽂句号“.”占1个字节的⼤⼩,中⽂句号“。”占2个字节的⼤⼩。
x表⽰⽆的意思,utf8英⽂省空间
字符(不同⽅式编码给⼈看),字节(计算机看)
⼩写英⽂字母、数字和⼀些符号,这个编码表被称为ASCII编码,⽐如⼤写字ASCII:最早只有127个字符被编码到计算机⾥,也就是⼤⼩写英⽂字母、数字和⼀些符号
ASCII
母A的编码是65。
我们平时说的 ASCII 其实有两个含义,⼀个是 ASCII 字符集,另⼀个是 ASCII 编码。
ASCII 字符集只是定义了字符与字符码(character code,也称 code point 代码点)的对应关系。也就是说这⼀层⾯只是规定了字符A⽤ 65 表⽰,⾄于这个 65 在内存或硬盘中怎么表⽰,它不管,那是 ASCII 编码做的事。
ASCII 编码规定了⽤ 7 个⼆进制位保存 ASCII 字符码(定义字符集的存储形式),剩下 1 位为 Parity bit,也称为校验位,⽤以检查数据的正确性。
Unicode把所有语⾔都统⼀到⼀套编码⾥,不会有乱码问题。(所有⽂字⽤这个)。
Unicode
UTF-8:本着节约的精神,把Unicode编码转化为“可变长编码”的UTF-8编码。UTF-8编码把⼀个Unicode字符根据不同的数字⼤⼩编码常⽤的英⽂字母被编码成1个字节,汉字通常是3个字节,只有很⽣僻的字符才会被编码成4-6个字节。如果你要传输成1-6个字节,常⽤的英⽂字母被编码成1个字节,汉字通常是3个字节,只有很⽣僻的字符才会被编码成4-6个字节
的⽂本包含⼤量英⽂字符,⽤UTF-8编码就能节省空间。
>>> '中'.encode('ascll')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
LookupError: unknown encoding: ascll
>>> '中'.encode('utf-8') #编码encode给计算机看
b'xe4xb8xad'
>>> b'xe4xb8xad'
b'xe4xb8xad'
>>> b'xe4xb8xad'.decode('utf-8') #解码decode给⼈看
'中'
字符、代码点、⼆进制字节关系图
Character 字符。即我们看到的单个符号,像“A”、“啊”等
Code point 代码点。⼀个⽆符号数字,通常⽤16进制表⽰。代码点与字符的⼀⼀对应关系称为字符集(Character Set),这种对应关系肯定不⽌⼀种,也就导致了不同字符集的出现,像 ASCII、ISO-8859-1、GB2312、GBK、Unicode 等。
Bytes ⼆进制字节。其含义为代码点在内存或磁盘中的表⽰形式。代码点与⼆进制字节的⼀⼀对应关系称为编码(Encoding),当然这种对应关系也不是唯⼀的,所以编码也有很多种,像 ASCII、ISO-8859-1、ENC-CN、GBK、UTF-8等。
硬盘或者需要传输的时候,就转换为UTF-8编码。
内存中,统⼀使⽤Unicode编码,当需要保存到硬盘或者需要传输的时候,就转换为UTF-8编码
在计算机内存中,统⼀使⽤Unicode
内存⾥,编辑完成后,保存的时候再把Unicode转换为UTF-8保存⽤记事本编辑的时候,从⽂件读取的UTF-8字符被转换为Unicode字符到内存
到⽂件。
记事本存在硬盘上⾯
浏览⽹页的时候,服务器会把动态⽣成的Unicode内容转换为UTF-8再传输到浏览器:
也是存在硬盘上⾯
Python 3版本中,字符串以Unicode编码
Python 3版本中,字符串以Unicode
>>> print('包含中⽂的str')
包含中⽂的str
内存中以Unicode表⽰,⼀个字符对应若⼲个字节。如果要在⽹络上传输,或者保存到磁盘上,就需要
⽹络上传输,或者保存到磁盘上,就需要Python的字符串类型是str,在内存中以Unicode
把str变为以字节为单位的bytes。
前缀的单引号或双引号表⽰:
Python对bytes类型的数据⽤带b前缀的单引号或双引号表⽰
x = b'ABC'
要注意区分'ABC'和b'ABC',前者是str,后者虽然内容显⽰得和前者⼀样,但bytes的每个字符都只占⽤⼀个字节
的每个字符都只占⽤⼀个字节。
以Unicode表⽰的str通过encode()⽅法可以编码为指定的bytes,例如:
>>> 'ABC'.encode('ascii') #utf8占3字节
b'ABC' #还是3字节
>>> '中⽂'.encode('utf-8')
b'xe4xb8xadxe6x96x87'
>>> '中⽂'.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)
如果bytes中只有⼀⼩部分⽆效的字节,可以传⼊errors='ignore'忽略错误的字节:
>>> b'xe4xb8xadxff'.decode('utf-8', errors='ignore')
'中'
由于Python源代码也是⼀个⽂本⽂件,所以,当你的源代码中包含中⽂的时候,在保存源代码时,就需要务必指定保存为UTF-8编
当你的源代码中包含中⽂的时候,在保存源代码时,就需要务必指定保存为UTF-8编码。当Python解释器读取源代码时,为了让它按UTF-8编码读取,我们通常在⽂件开头写上这两⾏:
码。当Python解释器读取源代码时,为了让它按UTF-8编码读取
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
第⼀⾏注释是为了告诉Linux/OS X系统,这是⼀个Python可执⾏程序,Windows系统会忽略这个注释;
第⼆⾏注释是为了告诉Python解释器,按照UTF-8编码读取源代码,否则,你在源代码中写的中⽂输出可能会有乱码。
格式化
format()
>>> 'Hello, {0}, 成绩提升了 {1:.1f}%'.format('⼩明', 17.125)
'Hello, ⼩明, 成绩提升了 17.1%'
当str和bytes互相转换时,需要指定编码。最常⽤的编码是UTF-8。Python当然也⽀持其他编码⽅式,⽐如把Unicode编码成GB2312:
>>> '中⽂'.encode('gb2312')
b'xd6xd0xcexc4'
但这种⽅式纯属⾃⿇烦,如果没有特殊业务要求,请牢记仅使⽤UTF-8编码。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论