最早的字符串编码是美国标准信息交换码 ASCII,进对10个数字,26个大写英文字母、26个小写英文字母及一些其他符号进行了编码。ASCII采用1个字节来对字符进行编码,最多只能表示256个符号。
随着信息技术的发展和信息交换的需要,各国的文字都需要进行编码,不同的应用领域和场合对字符串编码的要求也略有不同,于是分别设计了不同的编码格式,常见的主要有UTF-8、UTF-16、UTF-32、GB2312、GBK、CP936、base64、CP437等。UTF-8编码是国际通用的编码,以1个字节表示英语字符(兼容ASCII),以3个字节表示中文,还有些语言的符号用2个字节(如俄语和希腊语符号)或4个字节,UTF-8对全世界所有国家需要用到的字符进行了编码。
不同编码格式之间相差很大,采用不同的编码格式意味着不同的表示和存储形式,把同一字符存入文件时,写入的内容可能会不同,在理解其内容时必须了解编码规则并进行正确的解码。如果解码方法不正确就无法还原信息,从这个角度来讲,字符串编码也具有加密的效果。
Python 3.x 完全支持中文,使用Unicode编码格式,无论是一个数字、英文字母,还是一个汉字,都按一个字符对待和处理。
1 >>> s = '中国'
2 >>> len(s)
3 2
4 >>> 姓名 = '张三'
5 >>> print(姓名)
6 张三
7 >>>
小提示:在Python程序、脚本中可以用如下方式指定编码
#coding=utf-8
#coding:urf-8
#- * -coding:utf-8 - * -
在Python中,字符串属于不可变序列类型,使用单引号、双引号、三引号或三双引号作为界定符,并且不同的界定符之间可以互相嵌套。下面几种都是合法的Python字符串:
1 'abc'
2 '123'
3 '中国'
4 "Python"
5 '''Tom said,"Let's go"'''
除了支持序列通用方法(包括双向索引、比较大小、计算长度、元素访问、切片等操作)以外,字符串类型还支持一些特有的操作方法,如格式化、字符串查找、字符串替换(注意,不是原地替换)、排版等。但由于字符串属于不可变序列,不能直接对字符串对象进行元素增加、修改与删除等操作。另外,字符串对象提供的replace()和translate()方法也不是对原字符串直接进行修改和替换,而是返回一个修改替换后的新字符串作为结果。
Python支持短字符串驻留机制,对于短字符串,将其赋值给多个不同的对象时,内容中只有一个副本,多个对象共享该副本,与其他类型数据具有相同的特点。然而,这一点并不适用于长字符串,长字符串不遵循驻留机制。个人认为,知道这个也没什么用。
如果需要判断一个变量是否为字符串,可以使用内置方法isinstance()或type()。
1 >>> type('中国')
2 <class 'str'>
3 >>>
4 >>> #编码成字节串,采用GBK编码格式
5 >>> type('中国'.encode('gbk'))
6 <class 'bytes'>
7 >>>
8 >>> bytes
9 <class 'bytes'>
10 >>>
11 >>> isinstance('中国',str)
12 True
13 >>>
14 >>> type('中国') == str
15 True
16 >>>
拓展知识:转义字符。是指在字符串中某些特定的附后前加一个斜线之后该字符被解释为另外一种含义,不再表示本来的字符。常见转义字符表如下:
转义字符 | 含义 |
\b | 退格,把光标移动到前一列位置 |
\f | 换页符 |
\n | 换行符 |
\r | 回车 |
\t | 水平制表符 |
\v | 垂直制表符 |
\\ | 一个\ |
\' | 单引号 |
\" | 双引号 |
\ooo | 3位八进制数对应的字符 |
\xhh | 2位十六进制数对应的字符 |
\uhhhh | 4位十六进制数表示的Unicode字符 |
下面代码演示了转义字符用法:
1 >>> print('Hello\nWorld') #包含转义字符的字符串
2 Hello
3 World
4 >>>
5 >>> oct(65)
6 '0o101'
7 >>>
8 >>> print('\101') #3位八进制数对应的字符
9 A
10 >>>
11 >>> hex(65)
12 '0x41'
13 >>>
14 >>> print('\x41') #2位十六进制数对应的字符
15 A
16 >>>
17 >>> ord('董')
18 33891
19 >>>
20 >>> hex(_)
21 '0x8463'
22 >>>
23 >>> print('\u8463') #4位十六进制表示的Unicode字符
24 董