字符集(character set)
字符集是用来表示语言符号的数字的集合
注意这只是数字(code point),不涉及用什么方法来存储数字
我们常见的字符集
ASCII 字符集
Unicode
gb2312、gbk、gb18030
字符编码和解码
字符是以字节的方式存储和传输的
字符编码是指把字符串用字节流表示的方法
字符编码和解码
我们常见的字符编码方式
ASCII
UTF-8
UCS2 UCS4(UTF-16 UTF-32)
gb2312、gbk、gb18030(Extended Unix Code-EUC)
Python3中字符串类型的内部表示其实是UTF-16 (Unicode)
Python2里面的字符串类型是原始的字符串
Python3中的编码
从Unicode字符串编码为指定格式的字符串:bytes对象
'你好’.encode('utf8')
Python3中的解码
从字符串(bytes对象)解码成字符串对象
byteVar.decode('utf8')
Python2中的编码:从Unicode对象编码为指定格式的字符串(string对象)
Python2中的解码:从字节串(string对象)解码成unicode对象
字形(glyph)和字体(font)
要把字形显示在显示器或者打印机上,我们必须定义一个给定的字符怎么显示的方法
一个文字的字形显示,英文叫glypy,它通过点阵或者矢量图的方式显示字体
字体文件就是存储了一种字符编码里面所有文字到字形的集合
显示utf8编码字符的过程
文字以某种编码保存在文件中
程序读取文件中的文字并且解码到Unicode
程序调用操作系统Windows服务,按照Unicode数字码在字体文件中查找字体图像
画到窗口上
代码处理中文
一个例子
如果我们在Python代码中加入中文
比如
#中文
print('abc')
Python3解释器缺省使用utf8码来解码代码文件
python2解释器缺省使用ascii码来解码代码文件
声明代码文件编码方式
告诉解释器,这个代码文件的编码方式
#coding=utf-8
#中文
print ('abc')
在代码的第一行或者第二行显示的加上一个注释# coding =utf-8指明代码文件的编码方式
如果是其他编码方式,比如gbk等,必须正确的指明
#coding = gbk
也可以用这种方式
#coding:gbk
声明和文件具体是什编码的没有关系 代码编辑器选择文件编码方式 根据文件编码方式正确声明
pycharm可以根据声明自动调整文件的编码方式 notepad++工具-首选项-新建 指定 utf-8(无bom)
运行的时候解释器会根据声明解码文件
pycharm编码如果代码中没有指明可以设置,如果已经指明,则不能设置
代码输出中文
输出中文
终端里面执行下面的程序,来打印中文字符到屏幕上
print('中文')
我们的输入的字符是utf8编码的
而“中文”两个字utf8编码 ox4b8ad oxe69697
执行时,解释器字符串内容解码为Unicode
输出给终端设备,必须将Unicode编码为一种编码格式的字符串(根据终端的编码方式进行转化)
解释器根据sys.stout.encoding对之进行转换
输出到文件
Python 2
文件对象没有文件的编码信息
也包含中文字符的Unicode字符串到中文的时候,必须要显示编码
#coding=utf-8
a = u'我们这时候'
print a
fh = open('file1','w')
fh.write(a.encode('utf8')) 字符串进行编码,底层存储是字节串
fh.close()
解释器执行打开代码文件
python3
文件对象包含了文件的编码信息:对文本模式打开有效
在读写文件内容的时候,底层会以参数指定的编码方式对文件内容自动进行编码和解码
OS平台相关 locale.getpreferredencoding()
a = '我们这时候’
print (a)
print (type(a))
fh = open('file1','w') 没有指定,缺省使用gbk
fh.write(a)
fh.close()
wb以二进制方式打开
fh = open('file1','wb')
fh.write(a.encode('utf8')) 或者 fh.write(b'a')
从文件读入
Python2 需要显示解码
#coding = utf-8
fh = open('file1') 打开不指定
bcStr = fh.read() #这里返回的是str类型
uc = bcStr.decode('utf8') 类似Python3里的二进制
print uc
print len(uc)
print len(bcStr)
Python3 无需显示解码
fh = open('file3.txt',encoding='utf8') 指定文件编码方式utf8,如果不指定,与操作系统相关,windows是gbk
bcStr = fh.read() #这里已经解码了 Python3里的str就是unicode
fh.close()
print(bcStr)
print(len(bcStr))
print(bcStr[2])
打开中文文件名
windows目前最流行的ntfs文件系统而言
文件名都是用utf-16(Unicode)编码
with open(‘中文.txt’,encoding='utf8') as f:
print(f.read())
用户输入中文
input() 用户输入中文
它的返回是 根据操作系统和输入的终端程序而定的,在中文操作系统上,用cmd窗口输入,返回的一般是gb系列的编码
a = raw_input(':')
用户输入中文细节过程
用户输入法输入中文字符(‘你们好’)
windows 操作系统会发生3个WM_CHAR消息给当前应用
WM_CHAR消息里面的编码是UTF-16
应用程序根据自身的设置,进行不同的处理
可能编码为gbk,也可能是UTF8
比如notepad++ 设置为gbk 编码或者utf8编码
代码文件、代码里输入输出中文是不一样的,一个是文件里一个是终端设备
Python代码文件不指定,缺省就是utf8加载的
程序输出到文件中,以文件打开方式来指定;不指定和操作系统相关,指定就以指定为准
终端是自动的