字符编码-11

字符集(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加载的

程序输出到文件中,以文件打开方式来指定;不指定和操作系统相关,指定就以指定为准

终端是自动的

原文地址:https://www.cnblogs.com/hyzhang/p/7678488.html