Python的字符串编码
Python的字符串编码
在Python 2中,字符串的编码问题是使用Python 2必经历的门槛。所幸到了Python 3,Python 3从编程语言的层面就减少了很多编码的问题,但学习字符串编码仍然是很有必要的。
为什么有编码问题
因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理。最早的计算机在设计时采用8个比特(bit)作为一个字节(byte),所以,一个字节能表示的最大的整数就是255(二进制11111111=十进制255)。0 - 255被用来表示大小写英文字母、数字和一些符号,这种编码方式被称为ASCII编码,比如大写字母 A 的编码是65,小写字母 z 的编码是122。
如果要表示中文,显然一个字节是不够的,至少需要两个字节,而且还不能和ASCII编码冲突,所以,中国制定了GB2312编码,用来把中文编进去。类似的,日文和韩文等其他语言也有这个问题。为了统一所有文字的编码,Unicode应运而生。Unicode把所有语言都统一到一套编码里,这样就不会再有乱码问题了。
Unicode通常用两个字节表示一个字符,原有的英文编码从单字节变成双字节,只需要把高字节全部填为0就可以。
Python 3的编码
在Python 3中,默认使用UTF-8 Unicode来进行编码,因此我们可以在Python中输入任意形式的Unicode字符串,都不会遇到像Python 2中遇到的问题(在Python 2中,需要显式指明该字符串是Unicode字符串)。如果没有了解过Python 2,则完全可以忽略这一点,Python 3提供了更加简单易懂的编码方式。
s1 = '这是中文字符串'
s2 = 'this is an English string'
print(s1)
print(s2)
在Python 3中,中文字符串和英文字符串无异。
任务
请定义并打印中英文混合的字符串:
mixed_string = "这是一句中英文混合的Python字符串:Hello World!"
print(mixed_string)
Python的字符串切片
字符串由一个个字符组成,每一个字符都有一个唯一的位置。比如字符串 'ABC'
,第一个字符是 A,第二个字符是 B,第三个字符是 C。因此我们可以使用位置的方式取出字符串中特定位置的字符,按照位置取字符串的方式使用中括号 []
访问,这个时候可以把字符串看作是一个列表(一种新的数据类型,在后面会继续学习),不过需要注意的是,在程序的世界中,计数是从0开始的,使用0来表示第一个。
s = 'ABC'
a = s[0] # 第一个
b = s[1] # 第二个
c = s[2] # 第三个
print(a) # ==> A
print(b) # ==> B
print(c) # ==> C
有时候,我们会想获取字符串的一部分(子串),这个时候我们采取切片的方式获取。切片需要在中括号 []
中填入两个数字,中间用冒号分开,表示子串的开始位置和结束位置,并且这是半闭半开区间,不包括最后的位置。
ab = s[0:2] # 取字符串s中的第一个字符到第三个字符,不包括第三个字符
print(ab) # ==> AB
我们定义一个更长的字符串,了解切片更多的细节。
s = 'ABCDEFGHIJK'
abcd = s[0:4] # 取字符串s中的第一个字符到第五个字符,不包括第五个字符
print(abcd) # ==> ABCD
cdef = s[2:6] # 取字符串s中的第三个字符到第七个字符,不包括第七个字符
print(cdef) # ==> CDEF
#注:
二进制的说明
什么是二进制
二进制(Binary)是一种数值表示法,使用两个符号(通常是0和1)来表示所有数值。与十进制(Decimal)系统不同,十进制使用十个符号(0-9)来表示数值。二进制是计算机内部数据处理的基础,因为计算机的硬件电路使用开关状态(开=1,关=0)来表示信息。
二进制的基本概念
- 位(Bit):二进制的基本单位,表示一个二进制数字(0或1)。
- 字节(Byte):通常由8个位组成,是计算机存储和处理数据的基本单位。一个字节可以表示256种不同的值(从0到255)。
二进制与其他进制的转换
1. 二进制与十进制的转换
-
从二进制到十进制:将二进制数的每一位乘以2的对应次方,然后求和。例如,二进制数
1011
转换为十进制:1 * 2^3 + 0 * 2^2 + 1 * 2^1 + 1 * 2^0 = 8 + 0 + 2 + 1 = 11
-
从十进制到二进制:可以使用除2取余法。将十进制数不断除以2,记录余数,直到商为0,然后将余数反向排列。例如,十进制数
11
转换为二进制:11 ÷ 2 = 5 余 1 5 ÷ 2 = 2 余 1 2 ÷ 2 = 1 余 0 1 ÷ 2 = 0 余 1
反向排列余数得到
1011
。
2. 二进制与十六进制的转换
十六进制(Hexadecimal)是一种使用16个符号(0-9和A-F)表示数值的进制。每个十六进制数字可以用4个二进制位表示。
-
从二进制到十六进制:将二进制数每4位分为一组,从右到左进行分组,然后将每组转换为对应的十六进制数字。例如,二进制数
10111011
转换为十六进制:1011 1011 → B B
所以,
10111011
的十六进制表示为BB
。 -
从十六进制到二进制:将每个十六进制数字转换为4位二进制。例如,十六进制数
A3
转换为二进制:A → 1010 3 → 0011
所以,
A3
的二进制表示为10100011
。
二进制在计算机中的应用
二进制是计算机内部数据处理的基础,所有的数据(包括文本、图像、音频等)最终都被转换为二进制形式进行存储和处理。计算机的运算、存储和通信都是基于二进制的。
- 数据存储:计算机使用二进制来表示和存储数据。每个字节由8个位组成,可以表示256种不同的值。
- 逻辑运算:计算机使用二进制进行逻辑运算,如与(AND)、或(OR)、非(NOT)等,这些运算是计算机处理信息的基础。
总结
二进制是计算机科学的基础,理解二进制及其与其他进制的转换对于学习计算机编程和数据处理至关重要。通过掌握二进制的基本概念和应用,您可以更深入地理解计算机的工作原理。
十六进制的说明
什么是十六进制
十六进制(Hexadecimal)是一种数值表示法,使用16个符号来表示数值。这16个符号包括数字0到9和字母A到F,其中A到F分别表示十进制的10到15。十六进制广泛应用于计算机科学和编程中,尤其是在表示颜色、内存地址和数据编码等方面。
十六进制的基本概念
- 位(Bit):十六进制的基本单位是位(bit),每个十六进制数字可以用4个位(即二进制位)表示。
- 字节(Byte):一个字节由8个位组成,可以表示256种不同的值。在十六进制中,一个字节可以用两个十六进制数字表示。
十六进制与其他进制的转换
1. 十六进制与十进制的转换
-
从十六进制到十进制:将每个十六进制数字乘以16的对应次方,然后求和。例如,十六进制数
1A3
转换为十进制:1 * 16^2 + A * 16^1 + 3 * 16^0 = 1 * 256 + 10 * 16 + 3 * 1 = 256 + 160 + 3 = 419
-
从十进制到十六进制:可以使用除16取余法。将十进制数不断除以16,记录余数,直到商为0,然后将余数反向排列。例如,十进制数
419
转换为十六进制:419 ÷ 16 = 26 余 3 26 ÷ 16 = 1 余 10 (A) 1 ÷ 16 = 0 余 1
反向排列余数得到
1A3
。
2. 十六进制与二进制的转换
-
从十六进制到二进制:将每个十六进制数字转换为4位二进制。例如,十六进制数
2F
转换为二进制:2 → 0010 F → 1111
所以,
2F
的二进制表示为00101111
。 -
从二进制到十六进制:将二进制数每4位分为一组,从右到左进行分组,然后将每组转换为对应的十六进制数字。例如,二进制数
11011111
转换为十六进制:1101 1111 → D F
所以,
11011111
的十六进制表示为DF
。
十六进制在计算机中的应用
十六进制在计算机科学中有广泛的应用,主要包括:
- 颜色表示:在网页设计和图形编程中,颜色通常使用十六进制表示。例如,红色可以表示为
#FF0000
,其中FF
表示红色的强度,00
表示绿色和蓝色的强度。 - 内存地址:计算机的内存地址通常使用十六进制表示,以便更简洁地表示较大的数值。
- 数据编码:在某些数据格式(如图像文件、音频文件等)中,数据常常以十六进制形式存储,以便于读取和处理。
总结
十六进制是一种重要的数值表示法,广泛应用于计算机科学和编程中。理解十六进制及其与其他进制的转换对于学习计算机编程、数据处理和图形设计等领域至关重要。掌握十六进制的基本概念和应用将帮助您更深入地理解计算机的工作原理。