
我们已经提到字符串也是一种数据类型. 但是,字符串的特点是存在编码问题.
因为计算机只能处理数字,所以如果要处理文本,则必须先将文本转换为数字,然后才能进行处理. 最早的计算机在设计中使用8位作为字节. 因此,一个字节可以代表的最大整数是255(二进制11111111 =十进制255). 如果要表示一个较大的整数,则必须使用更多的字节. 例如,可以用两个字节表示的最大整数是65535,可以用4个字节表示的最大整数是4294967295.
由于计算机是美国人发明的,最早只有127个字符被编码到计算机中,即大写和小写英文字母字符串,数字和一些符号. 该编码表称为ASCII编码,例如大写字母A. 代码为65,小写字母z的代码为122.
但是显然一个字节不足以处理中文. 至少需要两个字节,并且它不能与ASCII编码冲突. 因此,中国已开发出GB2312编码以合并中文.
您可以想象的是,世界上有数百种语言. 日本将日文编译为Shift_JIS,韩国将韩文编译为Euc-kr. 每个国家都有自己的标准,因此不可避免地会发生冲突. 也就是说,在多语言混合文本中,将显示乱码.
因此,Unicode应运而生. Unicode将所有语言统一为一组编码,因此不会再出现乱码了.
Unicode标准也在不断发展,但是最常用的一种是使用两个字节来表示一个字符(如果要使用非常远程的字符,则需要4个字节). 现代操作系统和大多数编程语言直接支持Unicode.
现在,让我们看一下ASCII编码和Unicode编码之间的区别: ASCII编码为1个字节,而Unicode编码通常为2个字节.
字母A的ASCII码为十进制的65和二进制的01000001;
ASCII代码中的字符0为十进制的48和二进制的00110000. 请注意,字符“ 0”和整数0是不同的;
汉字已超出ASCII编码的范围. Unicode编码为十进制的20013和二进制的01001110 00101101.
您可以猜测,如果将Unicode编码用于ASCII编码A,则只需在前面添加0. 因此,A的Unicode编码为00000000 01000001.
又出现了一个新问题: 如果将其统一为Unicode,则乱码问题将消失. 但是,如果您编写的文本基本上全部是英语,则Unicode编码所需的存储空间是ASCII编码的两倍,这在存储和传输方面非常不经济.
因此,本着节约的精神,再次出现了将Unicode编码转换为“可变长度编码”的UTF-8编码. UTF-8编码根据不同的数字大小将Unicode字符编码为1-6个字节. 常用英文字母编码为1个字节,汉字通常为3个字节. 仅将非常稀有的字符编码为4-6个字节. 如果要传输的文本包含很多英文字符,则使用UTF-8编码可以节省空间:
字符ASCIIUnicodeUTF-8
A
01000001
00000000 01000001

01000001
中等
x
01001110 00101101
11100100 10111000 10101101
从上表中,您还可以发现UTF-8编码还有其他好处,即ASCII编码实际上可以视为UTF-8编码的一部分. 因此,许多仅支持ASCII编码的历史软件可以在UTF-8编码下继续工作.
在弄清了ASCII,Unicode和UTF-8之间的关系之后,我们可以总结一下计算机系统中字符编码的当前工作方法:
在计算机内存中,统一使用Unicode编码,当需要将其保存到硬盘或进行传输时,它会转换为UTF-8编码.
使用记事本进行编辑时,将从文件读取的UTF-8字符转换为Unicode字符到内存中. 编辑后,保存时,将Unicode转换为UTF-8并保存到文件:
浏览Web时,服务器会将动态生成的Unicode内容转换为UTF-8,然后将其传输到浏览器:
因此,在许多网页的源代码上您会看到类似的信息,这表明该网页已以UTF-8编码.
弄清楚麻烦的字符编码问题后,让我们研究Python字符串.
在最新版本的Python 3中,字符串以Unicode编码,这意味着Python字符串支持多种语言,例如:
>>> print('包含中文的str')
包含中文的str
对于单个字符的编码,Python提供了ord()函数来获取字符的整数表示,而chr()函数将编码转换为相应的字符:
>>> ord('A')
65
>>> ord('中')
20013
>>> chr(66)
'B'
>>> chr(25991)
'文'
如果您知道字符的整数编码,也可以用十六进制形式写str:

>>> '\u4e2d\u6587'
'中文'
两种书写方式完全相同.
由于Python的字符串类型为str,因此在内存中以Unicode表示,并且一个字符对应几个字节. 如果要在网络上传输或保存到磁盘,则需要将str更改为以字节为单位的字节.
Python使用以b开头的单引号或双引号来表示字节数据:
x = b'ABC'
请注意区分“ ABC”和“ b'ABC”. 前者是str. 尽管后者的内容显示与前者相同字符串,但每个字节字符仅占用一个字节.
可以使用encode()方法将以Unicode表示的str编码为指定的字节,例如:
>>> '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)
纯英语的str可以用ASCII编码为字节,并且内容相同,包含中文的str可以用UTF-8编码为字节. 包含中文的str不能用ASCII编码,因为中文编码的范围超出了ASCII编码的范围,并且Python将报告错误.
以字节为单位,用\ x ##显示无法显示为ASCII字符的字节.
相反,如果我们从网络或磁盘读取字节流,则读取的数据为字节. 要将字节转换为str,需要使用decode()方法:
>>> b'ABC'.decode('ascii')
'ABC'
>>> b'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8')
'中文'
如果字节包含无法解码的字节,则define()方法将报告错误:
>>> 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
如果字节中只有一小部分无效字节,则可以传递errors ='ignore'来忽略错误的字节:
>>> b'\xe4\xb8\xad\xff'.decode('utf-8', errors='ignore')
'中'
要计算str包含多少个字符,可以使用len()函数:
>>> len('ABC')
3
>>> len('中文')
2
len()函数计算str中的字符数. 如果用字节替换,则len()函数将计算字节数:

>>> len(b'ABC')
3
>>> len(b'\xe4\xb8\xad\xe6\x96\x87')
6
>>> len('中文'.encode('utf-8'))
6
可以看出,经过UTF-8编码后,汉字通常占3个字节,而英文字符仅占1个字节.
在处理字符串时,我们经常遇到str和字节之间的转换. 为了避免出现乱码问题,应始终使用UTF-8编码来转换str和字节.
由于Python源代码也是文本文件,因此当源代码包含中文时,在保存源代码时必须指定UTF-8编码. 当Python解释器读取源代码时,为了使它以UTF-8编码读取,我们通常在文件开头写入以下两行:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
注释的第一行是告诉Linux / OS X系统,这是一个Python可执行程序,Windows系统将忽略此注释;
第二行注释是告诉Python解释器根据UTF-8编码读取源代码. 否则,您在源代码中编写的中文输出可能会出现乱码.
确认UTF-8编码并不意味着您的.py文件是UTF-8编码的. 您必须并确保文本编辑器使用的是没有BOM编码的UTF-8:
如果.py文件本身使用UTF-8编码,并且还声明#-*-编码: utf-8-*-,请打开命令提示符以测试并正常显示中文:
最后一个常见问题是如何输出格式化的字符串. 我们经常输出类似'Hello dear xxx!您xx个月的电话费是xx,余额是类似xx'的字符串,xxx的内容根据变量而变化. 因此,需要一种简单的格式化字符串的方法.
在Python中,使用的格式化方法与C语言相同,例如,通过%实现:
>>> 'Hello, %s' % 'world'
'Hello, world'
>>> 'Hi, %s, you have $%d.' % ('Michael', 1000000)
'Hi, Michael, you have $1000000.'
您可能已经猜到了,%运算符用于格式化字符串. 在字符串中,%s表示用字符串替换,%d表示用整数替换,有几个%?占位符,后跟几个变量或值,并且顺序应相对应. 如果只有一个%?,则可以省略括号.
常见的占位符是:
占位符替换内容
%d

整数
%f
浮点数
%s
字符串
%x
十六进制整数
其中,在格式化整数和浮点数时,还可以指定是否添加0以及整数和小数位数:
# -*- coding: utf-8 -*-
----
print('%2d-d' % (3, 1))
print('%.2f' % 3.1415926)
如果不确定使用什么,%s将始终有效,它将任何数据类型转换为字符串:
>>> 'Age: %s. Gender: %s' % (25, True)
'Age: 25. Gender: True'
有时,如果字符串中的%是正常字符怎么办?此时,您需要转义,使用%%代表a%:
>>> 'growth rate: %d %%' % 7
'growth rate: 7 %'
格式化字符串的另一种方法是使用字符串的format()方法,该方法将依次用传递的参数替换字符串中的占位符{0},{1} ...,但是这种方式比%麻烦得多:
>>> 'Hello, {0}, 成绩提升了 {1:.1f}%'.format('小明', 17.125)
'Hello, 小明, 成绩提升了 17.1%'
小明的得分从去年的72分上升到今年的85分. 请计算小明改进的百分比,并以字符串格式显示“ xx.x%”,仅保留小数点后一位:
# -*- coding: utf-8 -*-
s1 = 72
s2 = 85
----
r = ???
print('???' % r)
Python 3对字符串使用Unicode,它直接支持多种语言.
在str和字节之间转换时,需要指定编码. 最常用的编码是UTF-8. 当然,Python还支持其他编码方法,例如将Unicode编码为GB2312:
>>> '中文'.encode('gb2312')
b'\xd6\xd0\xce\x'
但是这种方法纯属自找麻烦. 如果没有特殊的业务要求,请记住仅使用UTF-8编码.
格式化字符串时,可以使用Python的交互式环境进行测试,这既方便又快捷.
the_string.py
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-288985-1.html
平台比较大
你想成为第几个死的