分享

字符编码

 印度阿三17 2020-03-12

字符编码表就是一张字符与数字的对应关系的表

内存

上 ------------------->翻译 ------------------>01011010

上 <-------------------- 翻译<-----------------01011010

ASCII表:

1、只支持英文字符串

2、采用 8 位二进制数对应一个英文字符串

GBK 表:

1、支持英文字符、中文字符

2、采用 8 位(8bit=1Bytes)二进制数对应一个英文字符串

采用 16 位(16bit = 2Bytes)二进制数对应一个中文字符串

unicode(内存中统一使用 unicode):

1、兼容万国字符,与万国字符都有对应关系

2、采用 16 位(16bit=2Bytes)二进制对应一个字符串

个别生僻会采用 4Bytes 、8Bytes

人类输入的字符------------->unicode格式数字(内存中)<------------->GBK格式二进制(硬盘)

人类输入的字符------------->unicode格式数字(内存中)<------------->Shift_JIS格式二进制(硬盘)

注:GBK 与 Shift_JIS字符编码都可以转为 unicode,但是它们两之间不能通过 unicode互转

UTF-8:

1、英文采用1 个 Bytes

2、中文采用 3 个 Bytes

window :默认采用 GBK

mac :默认采用 utf-8

linux:默认采用 utf-8

python 文件的执行过程:

1、先将 python 解释器启动

2、调用系统操作,将文本文件内容由硬盘读入内存

3、解释器解释并执行刚刚读入内存的文本内容,识别相关语法。

python 解释器:

python 2:默认的是 ascii 码

python 3:默认的是 utf-8 码

为了能够在 python2 解释器读入文本文件不乱码,可以在文本文件开头指定编码格式,这样 python2 解释器将内容读入内存时就会知道 文本内容使用的编码格式。

保证了运行 python 程序前两个阶段不乱码的核心是指定编码格式,即用什么编码存入硬盘的:

在 文件首行写入包含 # 号在内的以下内容:

#coding:当初写入硬盘时采用的编码格式    #告诉 python 解释器,文本内容的编码格式

解释器会先用默认的编码方式读取文件的首行内容,由于首行是纯英文组成,而任何编码方式都可以识别英文字符。

例:

在 python2 中

# coding:utf-8
x = '上' # x的值为untf-8格式的二进制  python解释器执行到这一步时,会新建一块内存空间来存入 "上" 值。
print(x) # 打印操作是将x的值,即utf-8格式的二进制交给终端,当终端收到后发现并不是unicode(只有unicode才与字符有对应关系),所以终端会执行操作:utf-8二进制---解码(decode)-->unicode格式的二进制,解码的过程中使用的程序终端会采用自己默认的编码格式,而在pycharm的终端默认编码为utf-8、windows下的cmd终端的默认编码为gbk,所以该打印操作在pycharm中显示正常,而在windows下的cmd中则乱码

# 在windows下的cmd中运行效果如下
C:\Users\Administrator>python2 E:\aaa.py
涓

python2:str 有两种类型:str 和 unicode

str类型:

     x = ‘上’    #字符串会按照文件头指定的编码格式存入变量值的内存空间

unicode 类型:

    #coding:utf-8
  x = u‘上’   #强调存成 unicode 等同于 x= '上'.decode(utf-8)

保证python2 的 str 类型不乱码:

#coding:utf-8
  x = u'上' # #强调存成 unicode 等同于 x= '上'.decode(utf-8)

python3:str 类型默认直接存为 unicode 格式,无论如何都不会乱码

结论:

1、内存中固定使用的是 unicode、这是不能改变的,我们可以改变的是存入硬盘的格式

        英文 汉字-》unicode-》gbk
  
    英文 日文-》unicode-》shift-jis
    
    万国字符》-unicode-》utf-8

2、文本文件存取乱码问题

1)存乱了:

例:如果用户输入的内容中包含中文和日文字符,如果单纯以shift_JIS存,日文可以正常写入硬盘,而由于中文字符在shift_jis中没有找到对应关系而导致存乱了

解决方法是:将文本文件编码格式设置成支持文件内字符串的格式

2)读乱了:

例:如果硬盘中的数据是shift_JIS格式存储的,采GBK格式读入内存就读乱了

解决方法是:文件以什么编码格式存如硬盘,就应该以什么编码格式读入内存。

总结:

1、保证存的时候不乱:在由内存写入硬盘时,必须将编码格式设置为支持所输入字符的编码格式

2、保证读的时候不乱:在由硬盘读入内存是,必须采用与写入硬盘时相同的编码格式

二 编码与解码

编码:

由字符转换成内存中 unicode,以及由 unicode转换成其他编码(存在硬盘里)的过程,都称为编码encode

字符-------------encode-------------》unicode---------encode---------》GBK、utf-8、Shift_JIS

解码:

由内存中的 unicode 转换成字符,以及由其他编码(存在硬盘里)转换成 unicode 的过程,都被称为解码 decode

(utf-8、Shift_JIS、GBK--------decode----------》unicode-----------decode---------------》字符

1036857-20170909230621226-849802883

补充:

浏览网页的时候,服务器会把动态生成的 unicode 内容转为 UTF-8 再传输到浏览器

如果服务端 encode 的编码格式是utf-8,客户端内存中收到的也是 utf-8 编码的结果

来源:https://www./content-4-657401.html

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多