编码问题详解

编码问题详解

1、总述

编码python

大小linux

支持语言编程

ASCII小程序

1个字节(byte)=8bit=2位16进制数,表示127个字符windows

英文浏览器

Unicode服务器

用至多2个字节表示65535个字符。(16bit=2byte)之间的数字来表示全部字符 (python3在内存中的编码方式)网络

全部语言编程语言

Unicode2函数

用至多4个字节表示全部字符

 

UTF-8

1-6个字节,英文字母1个字节,汉字3个字节,生僻字4-6个字节(外存或网络通讯中的编码方式)

全部语言

 

 

2、ASCII

标准ASCII 码,使用7 位二进制数(第1位二进制为0)来表示全部的大写和小写字母,数字0 到九、标点符号,以及在美式英语中使用的特殊控制字符

最先只有127个字母被编码到计算机里,也就是大小写英文字母、数字和一些符号,这个编码表被称为ASCII编码,好比大写字母A的编码是65,小写字母z的编码是122。

3、Unicode

1. 什么是unicode

 

要处理中文显然一个字节是不够的,至少须要两个字节,并且还不能和ASCII编码冲突,因此,中国制定了GB2312编码,用来把中文编进去。

全世界有上百种语言,Unicode把全部语言都统一到一套编码里,这样就不会再有乱码问题了。

Unicode标准也在不断发展,但最经常使用的是用1-2个字节表示一个字符(若是要用到很是偏僻的字符,就须要4个字节)。现代操做系统和大多数编程语言都直接支持Unicode。

 

2. 容易歧义的2字节问题

  unicode的第一个版本是用两个字节(16bit)来表示全部字符实际上这么说容易让人产生歧义,咱们总以为两个字节就表明保存在计算机中时是两个字节因而任何字符若是用unicode表示的话保存下来都占两个字节.其实这种说法是错误的.

  其实Unicode涉及到两个步骤,首先是定义一个规范,给全部的字符指定一个惟一对应的数字,这彻底是表示问题,能够跟计算机没半毛钱关系.第二步才是怎么把字符对应的数字保存在计算机中,这才涉及到实际在计算机中占多少字节空间

Unicode只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储。

  因此咱们也能够这样理解,Unicode是用0至65535之间的数字来表示全部字符.其中0至127这128个数字表示的字符仍然跟ASCII彻底同样.unicode兼容了ascii,即若是是英文的,前8位就是0,后8位就是ascii;若是前8位有值,就是中文编码。例如,65536是2的16次方.这是第一步.第二步就是怎么把0至65535这些数字转化成01串保存到计算机中这确定就有不一样的保存方式了因而出现了UTF(unicode transformation format),有UTF-8,UTF-16等存储方式。

3. 总结

 

综上,python字符串,在运行时,在内存中保存为Unicode数据,2个字节做为一个字,但保存.py文件到磁盘、网络中,会编码为utf-8等格式,它们以字节码(字节串bytes)的形式保存在介质上。而想从网络或磁盘中读取数据,就是要把utf-8或其余编码从字节码(字节串bytes)解码为unicode字符串。

 

 

python3中的字符串与python2中的u'字符串',都是unicode,只能encode,因此不管如何打印都不会乱码,由于能够理解为从内存打印到内存,即内存->内存,unicode->unicode

另外,文件(如txt)的保存又是另外一种状况,windows平台下使用python内置函数 open() 时发现,当不传递encoding参数时,会自动采用gbk(cp936)解码打开文件linux默认会采用utf-8解码,而当下很大部分软件的编码方式都是UTF-8,因此打开会报错。

微软发布系统因为没有使用unicode编码,因此windows要发布中文版,日本版,德国版...而苹果用的是unicode,只须要一套系统,直接改编码便可。

4、数据传输与编码

在计算机内存中,统一使用Unicode编码,当须要保存到硬盘或者须要传输的时候,转换为UTF-8编码。

Linux系统,用记事本编辑的时候,从文件读取的UTF-8字符被解码Unicode字符到内存里,编辑完成后,保存的时候再把Unicode编码UTF-8保存到文件:

 

 

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

 

 

5、UTF-8

UTF-8是Unicode的实现方式之一。UTF-8 是一种 Unicode 的编码方式,主要做用对 Unicode 码的数据进行转换,转换后方便存储和网络传输。本着节约的精神,又出现了把Unicode编码转化“可变长编码”的UTF-8编码(unicode transformation format)UTF-8编码把一个Unicode字符根据不一样的数字大小编码成1-6个字节,经常使用的英文字母被编码成1个字节,汉字一般是3个字节,只有很生僻的字符才会被编码成4-6个字节。若是你要传输的文本包含大量英文字符,用UTF-8编码就能节省空间。

UTF-8编码有一个额外的好处,就是ASCII编码实际上能够被当作是UTF-8编码的一部分,因此,大量只支持ASCII编码的历史遗留软件能够在UTF-8编码下继续工做。

8不是指一个字节,难道一个字节表示一个字符?实际上不是.当用UTF-8时表示一个字符是可变的,有多是用一个字节表示一个字符,也多是两个,三个..反正是根据字符对应的数字大小来肯定

 

UTF-8表示"汉"

Unicode符号范围        | UTF-8编码方式
(十六进制)       | (二进制)
--------------------+---------------------------------------------
0000 0000-0000 007F        | 0xxxxxxx
0000 0080-0000 07FF       | 110xxxxx 10xxxxxx
0000 0800-0000 FFFF        | 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF        | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

UTF-8就有复杂点.由于此时程序是把一个字节一个字节的来读取,而后再根据字节中开头的bit标志来识别是该把1个仍是两个或三个字节作为一个单元来处理.

0xxxxxxx,若是是这样的01串,也就是以0开头后面是啥就不用管了XX表明任意bit.就表示把一个字节作为一个单元.就跟ASCII彻底同样.

110xxxxx 10xxxxxx.若是是这样的格式,则把两个字节当一个单元

1110xxxx 10xxxxxx 10xxxxxx 若是是这种格式则是三个字节当一个单元.(汉子一般在这个区域)

这是约定的规则.你用UTF-8来表示时必须遵照这样的规则咱们知道UTF-16不须要用啥字符来作标志,因此两字节也就是2的16次能表示65536个字符.

UTF-8因为里面有额外的标志信息,全部一个字节只能表示2的7次方128个字符,两个字节只能表示2的11次方2048个字符.而三个字节能表示2的16次方,65536个字符

因为"汉"的编码6C4927721大于2048了全部两个字节还不够,只能用三个字节来表示要用1110xxxx 10xxxxxx 10xxxxxx这种格式.把27721对应的二进制从左到右填充XXX符号.

由上面咱们能够看出UTF-8在局部的字节错误(丢失、增长、改变)不会致使连锁性的错误,由于 UTF-8 的字符边界很容易检测出来,因此容错性较高。

6、UTF-16

UTF-16比较好理解,就是任何字符对应的数字都用两个字节来保存咱们一般对Unicode的误解就是把Unicode与UTF-16等同了可是很显然若是都是英文字母这作有点浪费.明明用一个字节能表示一个字符为啥整两个啊

因而UTF-8和UTF-16的优劣很容易就看出来了若是所有英文或英文与其余文字混合,但英文占绝大部分,用UTF-8就比UTF-16节省了不少空间.而若是所有是中文这样相似的字符或者混合字符中中文占绝大多数.UTF-16就占优点了

你可能会问当用程序打开一个文件时咱们怎么知道那是用的UTF-8仍是UTF-16啊.天然会有点啥标志,在文件的开头几个字节就是标志

EF BB BF 表示UTF-8

FE FF 表示UTF-16.

 

例如,中文字"汉"对应的unicode是6C4927721

UTF-16表示的话就是01101100   01001001(共16 bit,两个字节)

 

 

 

7、UnicodeUTF-8之间的转换

 

"严"的Unicode码是4E25,UTF-8编码是E4B8A5,二者是不同的。它们之间的转换能够经过程序实现。

Windows平台下,有一个最简单的转化方法,就是使用内置的记事本小程序Notepad.exe。打开文件后,点击"文件"菜单中的"另存为"命令,会跳出一个对话框,在最底部有一个"编码"的下拉条。

 

里面有四个选项:ANSI,Unicode,Unicode big endian 和 UTF-8。

1)ANSI是默认的编码方式。对于英文文件是ASCII编码,对于简体中文文件是GB2312编码(只针对Windows简体中文版,若是是繁体中文版会采用Big5码)。

2)Unicode编码指的是UCS-2编码方式,即直接用两个字节存入字符的Unicode码。这个选项用的little endian格式。

3)Unicode big endian编码与上一个选项相对应。

4)UTF-8编码,也就是上一节谈到的编码方法。

选择完"编码方式"后,点击"保存"按钮,文件的编码方式就马上转换好了。

 

 

8、Unicode2

前面说的都是unicode的第一个版本.但65536显然不算太多的数字,用它来表示经常使用的字符是没一点问题.足够了,但若是加上不少特殊的就也不够了.因而从1996年开始又来了第二个版本.用四个字节表示全部字符.这样就出现了UTF-8,UTF16,UTF-32.原理和以前确定是彻底同样的,UTF-32就是把全部的字符都用32bit也就是4个字节来表示.而后UTF-8,UTF-16就视状况而定了UTF-8能够选择1至8个字节中的任一个来表示.而UTF-16只能是选两字节或四字节.

前面说了要知道具体是哪一种编码方式,须要判断文本开头的标志

9、Big-Endian and Little-Endian

 

填充方式能够不同,因而就出现了Big-Endian,Little-Endian的术语.Big-Endian就是从左到右,Little-Endian是从右到左

EF BB BF    UTF-8
FE FF     UTF-16/UCS-2, little endian
FF FE     UTF-16/UCS-2, big endian
FF FE 00 00  UTF-32/UCS-4, little endian.
00 00 FE FF  UTF-32/UCS-4, big-endian.

Unicode码能够采用UCS-2格式直接存储。以汉字"严"为例,Unicode码是4E25,须要用两个字节存储,一个字节是4E,另外一个字节是25。存储的时候,4E在前,25在后,就是Big endian方式;25在前,4E在后,就是Little endian方式。

那么很天然的,就会出现一个问题:计算机怎么知道某一个文件到底采用哪种方式编码?

Unicode规范中定义,每个文件的最前面分别加入一个表示编码顺序的字符,这个字符的名字叫作"零宽度非换行空格"(ZERO WIDTH NO-BREAK SPACE),用FEFF表示。这正好是两个字节,并且FF比FE大1。若是一个文本文件的头两个字节是FE FF,就表示该文件采用大头方式;若是头两个字节是FF FE,就表示该文件采用小头方式。

 

下面,举一个实例。

打开"记事本"程序Notepad.exe,新建一个文本文件,内容就是一个"严"字,依次采用ANSI,Unicode,Unicode big endian 和 UTF-8编码方式保存。

而后,用文本编辑软件UltraEdit中"十六进制功能",观察该文件的内部编码方式。

1)ANSI:文件的编码就是两个字节"D1 CF",这正是"严"的GB2312编码,这也暗示GB2312是采用大头方式存储的。

2)Unicode:编码是四个字节"FF FE 25 4E",其中"FF FE"代表是小头方式存储,真正的编码是4E25。

3)Unicode big endian:编码是四个字节"FE FF 4E 25",其中"FE FF"代表是大头方式存储。

4)UTF-8:编码是六个字节"EF BB BF E4 B8 A5",前三个字节"EF BB BF"表示这是UTF-8编码,后三个"E4B8A5"就是"严"的具体编码,它的存储顺序与编码顺序是一致的

 

10、一些抉择

 

UTF-16 并非一个完美的选择,它存在几个方面的问题:

  1. UTF-16 能表示的字符数有 6 万多,看起来不少,可是实际上目前 Unicode 5.0 收录的字符已经达到 99024 个字符,早已超过 UTF-16 的存储范围;这直接致使 UTF-16 地位颇为尴尬——若是谁还在想着只要使用 UTF-16 就能够高枕无忧的话,恐怕要失望了
  2. UTF-16 存在大小端字节序问题,这个问题在进行信息交换时特别突出——若是字节序未协商好,将致使乱码;若是协商好,可是双方一个采用大端一个采用小端,则必然有一方要进行大小端转换,性能损失不可避免(大小端问题其实不像看起来那么简单,有时会涉及硬件、操做系统、上层软件多个层次,可能会进行屡次转换)
  3. 另外,容错性低有时候也是一大问题——局部的字节错误,特别是丢失或增长可能致使全部后续字符所有错乱,错乱后要想恢复,可能很简单,也可能会很是困难。(这一点在平常生活里你们感受彷佛可有可无,可是在不少特殊环境下倒是巨大的缺陷)

目前支撑咱们继续使用 UTF-16 的理由主要是考虑到它是双字节的,在计算字符串长度、执行索引操做时速度很快。固然这些优势 UTF-32 都具备,但不少人毕竟仍是以为 UTF-32 太占空间了。

反过来 UTF-8 也不完美,也存在一些问题:

  1. 文化上的不平衡——对于欧美地区一些以英语为母语的国家 UTF-8 简直是太棒了,由于它和 ASCII 同样,一个字符只占一个字节,没有任何额外的存储负担;可是对于中日韩等国家来讲,UTF-8 实在是太冗余,一个字符居然要占用 3 个字节,存储和传输的效率不但没有提高,反而降低了。因此欧美人民经常绝不犹豫的采用 UTF-8,而咱们却总是要犹豫一下子
  2. 变长字节表示带来的效率问题——你们对 UTF-8 疑虑重重的一个问题就是在于其由于是变长字节表示,所以不管是计算字符数,仍是执行索引操做效率都不高。为了解决这个问题,经常会考虑把 UTF-8 先转换为 UTF-16 或者 UTF-32 后再操做,操做完毕后再转换回去。而这显然是一种性能负担。



然,UTF-8 的优势也不能忘了:

  1. 字符空间足够大,将来 Unicode 新标准收录更多字符,UTF-8 也能妥妥的兼容,所以不会再出现 UTF-16 那样的尴尬
  2. 不存在大小端字节序问题,信息交换时很是便捷
  3. 容错性高,局部的字节错误(丢失、增长、改变)不会致使连锁性的错误,由于 UTF-8 的字符边界很容易检测出来,这是一个巨大的优势(正是为了实现这一点,我们中日韩人民不得不忍受 3 字节 1 个字符的苦日子)


那么到底该如何选择呢?
由于不管是 UTF-8 和 UTF-16/32 都各有优缺点,所以选择的时候应当立足于实际的应用场景。例如在个人习惯中,存储在磁盘上或进行网络交换时都会采用 UTF-8,而在程序内部进行处理时则转换为 UTF-16/32。对于大多数简单的程序来讲,这样作既能够保证信息交换时容易实现相互兼容,同时在内部处理时会比较简单,性能也还算不错。(基本上只要你的程序不是 I/O 密集型的均可以这么干,固然这只是我粗浅的认识范围内的经验,极可能会被无情的反驳)

11、汉字编码

 1个汉字是多少个字节?

: GBK(2个字节--windows)/ UTF-8(3个字节--linux)

GBK是ASCII的扩展集,ASCII使用一个字节,即8个二进制位,来表征英文字母和一些符号,一个字节能够最多表示2的8次方即256个字符。前127个被称为ASCII字符集,后续在ASCII的基础上进行扩展,将剩余的127个用来表征汉字,但汉字太多,因此不得不在必要时使用2个字符来表示更多的汉字,被称为GB2312字符集,后来仍然不够,又进一步扩展成GBK字符集。因此在此字符集中,英文占一个字节,汉字则占两个字节。

经常使用编码:中国大陆只有2种

 国标系列: GB18030(GBK(GB2312))(windows经常使用)

 例如,windows里建一个txt文件,文件里写10个汉字,文件是20字节,由于是gbk格式保存的。

  国际标准: UNICODE (2或4字节,全部国家编码不会冲突)<---> UTF-8 (Linux / Mac OS X / IOS / Android等经常使用)

 例如,在linux里建一个txt文件,文件里写10个汉字,文件是30字节,由于是utf-8

12、Python的编码相关问题

1. ord()chr()

功能:

ord(str)   返回一个字符的unicode编码

chr(unicode)  返回unicode对应的字符

 

>>> ord("发挥好")

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

TypeError: ord() expected a character, but string of length 3 found

出错缘由:一次只能查询一个字符的unicode编码

 

>>> ord("f")

102

 

>>> chr(102)

'f'

 

>>> ord("折")

25240

 

>>> chr(25240)

'折'

 

>>> ord('中')

20013

 

>>> ord('\u4e2d')   --python3.0支持嵌入unicode,这是“中”的unicode

20013

 

2. 字符串中使用的几种前缀

\u 后面通常跟4位16进制,表示2字节的unicode

\x 后跟2位16进制数,能够表示1字节的unicode(包括ASCII的所有内 容,也包括非ASCII的一些1字节的unicode)

b   表示原始字节值。前面加b表明使用ASCII字符集建立bytes字节串,只能建立ASCII字符集中存在的字符,中文字符前加b会报错(由于最大只能存一字节数据8位二进制数里面\x后跟2位16进制数,表示1字节,只能存ascii码。若是能显示这个字符,则显示这个字符。

Str: 能处理Unicode

 

>>> '\xEE'

'î'

 

>>> '\x41'

'A'

 

>>> '\xffff'

'ÿff'    --只把前2位当作16进制的unicode编码,其余按unicode表示的字符原样输出。

 

>>> '\x01c'

'\x01c'    --01的ascii和unicode码不是字符,则按普通字节原样输出

 

>>> '\u4f60'

'你'

 

>>> '\u4f609090'  

--只把前4位当作16进制的unicode编码,其余按unicode表示的字符原样输出。

 

'你9090'

 

>>> '\U00000041'

'A'

 

 

>>> b'abc'

b'abc'

 

>>> b'\xff22'

b'\xff22' --字节串 \xff若不是ascii码,会原样输出。

 

>>> b'\x30'

b'0'      --字节串 能显示为ASCII码会显示对应的字符

 

>>> b'5'

b'5'

 

>>> b'我'

  File "<stdin>", line 1

SyntaxError: bytes can only contain ASCII literal characters.

-- 只能存一个个字节,不能超过1字节

 

3. 编码与解码

Python程序在运行过程当中,字符串在内存中,只容许以unicode16/32编码存储。

 

外部文件(硬盘中)中能够有gbk,gb1312,gb18030,ascii,utf-8(字节串),但一旦造成python字符串,在python程序里运行时,必定是unicode全世界统一编码,即从外部编码获取最终的unicode值。

 

从内部字符串(内存)转到gbk,gb1312,gb18030,ascii,utf-8外部编码(即存到外存里),必须先编码S.encode(‘gbk’)。encode()函数能够将字符串转换为对应字符集的bytes(字节串)

 

>>> str='abc'

>>> str.decode()

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

AttributeError: 'str' object has no attribute 'decode'

 

以上出错的缘由:

Python字符串在内存中是unicode,不须要再解码成unicode了。

 

Print(str) 函数: 根据unicode打印字符串。若是str不是unicode,而是utf-8要解码为unicode才能打印出想要的样子,直接打印会打印成字节串bytes。

 

从外部编码(硬盘)转到内部字符串(python解释器、内存)用解码B.decode(‘gbk’)

 

 

 

例如:str ---> bytes 字符串编码成为字节串

 b = s.encode(encoding='utf-8')

 

bytes---> str 字节串解码成为字符串

 s = b.decode(encoding='utf-8')

 

 

>>> u = '中文'                 # 指定字符串类型对象u

 

>>> str1 = u.encode('gb2312')  

# 以gb2312编码对u进行编码,得到bytes字节串类型对象

 

>>> print(str1) 

b'\xd6\xd0\xce\xc4'  #打印字节码

 

>>> str2 = u.encode('gbk')     

# 以gbk编码对u进行编码,得到bytes字节串类型对象

 

>>> print(str2)

b'\xd6\xd0\xce\xc4'

 

>>> str3 = u.encode('utf-8')   

# 以utf-8编码对u进行编码,得到bytes字节串类型对象

 

>>> print(str3)

b'\xe4\xb8\xad\xe6\x96\x87'

 

>>> u1 = str1.decode('gb2312') # 以gb2312编码对字节串str1进行解码,得到unicode类型对象

 

>>> print('u1')

'中文'

 

>>> u2 = str1.decode('utf-8')  # 报错,由于str1是gb2312编码的

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd6 in position 0: invalid continuation byte

 

>>> 'x'+b'y'.decode()

'xy'

 

>>> 'x'.encode()+b'y'

b'xy'

 

4. python编码注释

编码注释的功能:告诉python解释器,这个脚本用什么编码来解码

 

在源文件的第一行或第二行写入以下内容:

  # -*- coding:gbk -*-

  # 设置源文件编码格式为:gbk

  # -*- coding:utf-8 -*-

  # 设置源文件编码格式为:UTF-8

 

世界上存在着多种编码方式,同一个二进制数字能够被解释成不一样的符号。所以,要想打开一个文本文件,就必须知道它的编码方式,不然用错误的编码方式解码,就会出现乱码。

注意:不写编码注释的话。在windows下写的代码(gbk编码)在linux下不能执行,由于linux会把这些gbk当作utf-8(Linux默认把中文当作utf-8),尝试按utf-8的格式把这些代码解码为unicode,在此过程当中会出错。若是写了编码注释linux会gbk的格式将其解码为unicode字符串,在python环境运行打印

 

实验:

 

Windows下编辑python文本文件,文件保存为gbk格式。

 

 

C:\code\studybook_3>python zs.py

  File "zs.py", line 1

SyntaxError: Non-UTF-8 code starting with '\xb9' in file zs.py on line 1, b

 encoding declared; see http://python.org/dev/peps/pep-0263/ for details

报错缘由:python解释器默认使用utf-8解码文件,而文件是用gbk编码的。

下面加上编码注释:

 

 

 

执行成功,编码注释告诉python解释器,要用gbk把文件解码为unicode字符串,再内存中打印。在Linux中也能正常打印。

 

 

 

 

Windows下编辑python文本文件,文件保存为utf-8格式。

 

 

运行正常,python解释器默认使用utf-8解码文件,而文件是用utf-8编码的,故能够正常解码为unicode。Linux同理。

 

 

5. Python文件编码

Windows下,系统默认用gbk\utf-8解码文件。

Linux下,系统默认用utf-8解码文件。

1 生成gbk文件

s='小甲'

with open("gbk2222.txt","w",encoding = "gbk") as f:

f.write(s)

Win下,以上代码生成gbk编码格式文件gbk2222.txt,用记事本自动用gbk解码,能打开;Linux下,系统默认用utf-8解码则不能打开。

 

 

 

 

2 生成utf-8文件

s='小甲'

with open("utf2222.txt","w",encoding = "utf-8") as f:

f.write(s)

Win下,以上代码生成utf-8编码格式文件utf2222.txt,用记事本自动用utf-8解码,能打开;Linux下,系统默认用utf-8解码也能打开。

 

 

 

 

 

 

3

with open("what","w") as f:

f.write(s)

Win下,不指定编码格式,生成文件what。

用记事本打开,发现文件默认保存为本地编码,即window保存为gbk编码;linux保存为utf-8编码。

4查看默认编码

windows下执行如下操做:

>>> import sys,locale

>>> sys.getdefaultencoding()

'utf-8'

>>> locale.getdefaultlocale()

('zh_CN', 'cp936')

以上说明,python内存默认采用utf-8 对.py文件进行解码。

Window默认采用cp926对文本文件进行解码。

 

linux下执行如下操做:

>>> import sys,locale

>>> sys.getdefaultencoding()

'utf-8'

>>> locale.getdefaultlocale()

('zh_CN', 'UTF-8')

以上说明,python内存默认采用utf-8 对.py文件进行解码。

linux默认采用UTF-8对文本文件进行解码。

 

5 查看不一样系统文本文件的默认编码

1)Windows记事本下建文本文件,输入汉字“中” ,

默认保存为ANSI 编码文本,即GBK,2字节。

windows记事本中显示正确,在linux打开乱码。由于linux是按utf-8解码打开文本文件的。

不一样的国家和地区制定了不一样的标准,由此产生了 GB23十二、GBK、GB18030、Big五、Shift_JIS 等各自的编码标准。这些使用多个字节来表明一个字符的各类汉字延伸编码方式,称为 ANSI 编码。在简体中文Windows操做系统中,ANSI 编码表明 GBK 编码;在繁体中文Windows操做系统中,ANSI编码表明Big5;在日文Windows操做系统中,ANSI 编码表明 Shift_JIS 编码。

2)Windows记事本下建文本文件,输入汉字“中”,

默认保存为utf-8编码文本,6字节。

windows记事本中显示正确,在linux打开,系统会按unicode解码后正常显示。

 

3)linux下建文本文件,输入汉字“中”,

默认保存为utf-8编码文本,4字节。

Windows记事本显示正常,win会按utf-8解码后读取unicode.

 

6 文件指定编码写入测试

Windows记事本写以下文件,用utf-8保存

 

 

运行后:

 

 

Python解释器内部,使用utf-8解码文件为unicode,而后打印。

文件utf1写入磁盘是utf-8编码 在win能打开,在linux能打开;

文件gbk1写入磁盘是gbk编码 在win能打开,在linux不能打开(linux只能用utf-8解码);

文件jis1写入磁盘是jis编码 在win不能打开,在linux不能打开;

 

附:ASCII码表具体以下所示

Bin

(二进制)

Oct

(八进制)

Dec

(十进制)

Hex

(十六进制)

缩写/字符

解释

0000 0000

00

0

0x00

NUL(null)

空字符

0000 0001

01

1

0x01

SOH(start of headline)

标题开始

0000 0010

02

2

0x02

STX (start of text)

正文开始

0000 0011

03

3

0x03

ETX (end of text)

正文结束

0000 0100

04

4

0x04

EOT (end of transmission)

传输结束

0000 0101

05

5

0x05

ENQ (enquiry)

请求

0000 0110

06

6

0x06

ACK (acknowledge)

收到通知

0000 0111

07

7

0x07

BEL (bell)

响铃

0000 1000

010

8

0x08

BS (backspace)

退格

0000 1001

011

9

0x09

HT (horizontal tab)

水平制表符

0000 1010

012

10

0x0A

LF (NL line feed, new line)

换行键

0000 1011

013

11

0x0B

VT (vertical tab)

垂直制表符

0000 1100

014

12

0x0C

FF (NP form feed, new page)

换页键

0000 1101

015

13

0x0D

CR (carriage return)

回车键

0000 1110

016

14

0x0E

SO (shift out)

不用切换

0000 1111

017

15

0x0F

SI (shift in)

启用切换

0001 0000

020

16

0x10

DLE (data link escape)

数据链路转义

0001 0001

021

17

0x11

DC1 (device control 1)

设备控制1

0001 0010

022

18

0x12

DC2 (device control 2)

设备控制2

0001 0011

023

19

0x13

DC3 (device control 3)

设备控制3

0001 0100

024

20

0x14

DC4 (device control 4)

设备控制4

0001 0101

025

21

0x15

NAK (negative acknowledge)

拒绝接收

0001 0110

026

22

0x16

SYN (synchronous idle)

同步空闲

0001 0111

027

23

0x17

ETB (end of trans. block)

结束传输块

0001 1000

030

24

0x18

CAN (cancel)

取消

0001 1001

031

25

0x19

EM (end of medium)

媒介结束

0001 1010

032

26

0x1A

SUB (substitute)

代替

0001 1011

033

27

0x1B

ESC (escape)

换码(溢出)

0001 1100

034

28

0x1C

FS (file separator)

文件分隔符

0001 1101

035

29

0x1D

GS (group separator)

分组符

0001 1110

036

30

0x1E

RS (record separator)

记录分隔符

0001 1111

037

31

0x1F

US (unit separator)

单元分隔符

0010 0000

040

32

0x20

(space)

空格

0010 0001

041

33

0x21

!

叹号

0010 0010

042

34

0x22

"

双引号

0010 0011

043

35

0x23

#

井号

0010 0100

044

36

0x24

$

美圆符

0010 0101

045

37

0x25

%

百分号

0010 0110

046

38

0x26

&

和号

0010 0111

047

39

0x27

'

闭单引号

0010 1000

050

40

0x28

(

开括号

0010 1001

051

41

0x29

)

闭括号

0010 1010

052

42

0x2A

*

星号

0010 1011

053

43

0x2B

+

加号

0010 1100

054

44

0x2C

,

逗号

0010 1101

055

45

0x2D

-

减号/破折号

0010 1110

056

46

0x2E

.

句号

0010 1111

057

47

0x2F

/

斜杠

0011 0000

060

48

0x30

0

字符0

0011 0001

061

49

0x31

1

字符1

0011 0010

062

50

0x32

2

字符2

0011 0011

063

51

0x33

3

字符3

0011 0100

064

52

0x34

4

字符4

0011 0101

065

53

0x35

5

字符5

0011 0110

066

54

0x36

6

字符6

0011 0111

067

55

0x37

7

字符7

0011 1000

070

56

0x38

8

字符8

0011 1001

071

57

0x39

9

字符9

0011 1010

072

58

0x3A

:

冒号

0011 1011

073

59

0x3B

;

分号

0011 1100

074

60

0x3C

<

小于

0011 1101

075

61

0x3D

=

等号

0011 1110

076

62

0x3E

>

大于

0011 1111

077

63

0x3F

?

问号

0100 0000

0100

64

0x40

@

电子邮件符号

0100 0001

0101

65

0x41

A

大写字母A

0100 0010

0102

66

0x42

B

大写字母B

0100 0011

0103

67

0x43

C

大写字母C

0100 0100

0104

68

0x44

D

大写字母D

0100 0101

0105

69

0x45

E

大写字母E

0100 0110

0106

70

0x46

F

大写字母F

0100 0111

0107

71

0x47

G

大写字母G

0100 1000

0110

72

0x48

H

大写字母H

0100 1001

0111

73

0x49

I

大写字母I

01001010

0112

74

0x4A

J

大写字母J

0100 1011

0113

75

0x4B

K

大写字母K

0100 1100

0114

76

0x4C

L

大写字母L

0100 1101

0115

77

0x4D

M

大写字母M

0100 1110

0116

78

0x4E

N

大写字母N

0100 1111

0117

79

0x4F

O

大写字母O

0101 0000

0120

80

0x50

P

大写字母P

0101 0001

0121

81

0x51

Q

大写字母Q

0101 0010

0122

82

0x52

R

大写字母R

0101 0011

0123

83

0x53

S

大写字母S

0101 0100

0124

84

0x54

T

大写字母T

0101 0101

0125

85

0x55

U

大写字母U

0101 0110

0126

86

0x56

V

大写字母V

0101 0111

0127

87

0x57

W

大写字母W

0101 1000

0130

88

0x58

X

大写字母X

0101 1001

0131

89

0x59

Y

大写字母Y

0101 1010

0132

90

0x5A

Z

大写字母Z

0101 1011

0133

91

0x5B

[

开方括号

0101 1100

0134

92

0x5C

\

反斜杠

0101 1101

0135

93

0x5D

]

闭方括号

0101 1110

0136

94

0x5E

^

脱字符

0101 1111

0137

95

0x5F

_

下划线

0110 0000

0140

96

0x60

`

开单引号

0110 0001

0141

97

0x61

a

小写字母a

0110 0010

0142

98

0x62

b

小写字母b

0110 0011

0143

99

0x63

c

小写字母c

0110 0100

0144

100

0x64

d

小写字母d

0110 0101

0145

101

0x65

e

小写字母e

0110 0110

0146

102

0x66

f

小写字母f

0110 0111

0147

103

0x67

g

小写字母g

0110 1000

0150

104

0x68

h

小写字母h

0110 1001

0151

105

0x69

i

小写字母i

0110 1010

0152

106

0x6A

j

小写字母j

0110 1011

0153

107

0x6B

k

小写字母k

0110 1100

0154

108

0x6C

l

小写字母l

0110 1101

0155

109

0x6D

m

小写字母m

0110 1110

0156

110

0x6E

n

小写字母n

0110 1111

0157

111

0x6F

o

小写字母o

0111 0000

0160

112

0x70

p

小写字母p

0111 0001

0161

113

0x71

q

小写字母q

0111 0010

0162

114

0x72

r

小写字母r

0111 0011

0163

115

0x73

s

小写字母s

0111 0100

0164

116

0x74

t

小写字母t

0111 0101

0165

117

0x75

u

小写字母u

0111 0110

0166

118

0x76

v

小写字母v

0111 0111

0167

119

0x77

w

小写字母w

0111 1000

0170

120

0x78

x

小写字母x

0111 1001

0171

121

0x79

y

小写字母y

0111 1010

0172

122

0x7A

z

小写字母z

0111 1011

0173

123

0x7B

{

开花括号

0111 1100

0174

124

0x7C

|

垂线

0111 1101

0175

125

0x7D

}

闭花括号

0111 1110

0176

126

0x7E

~

波浪号

0111 1111

0177

127

0x7F

DEL (delete)

删除

相关文章
相关标签/搜索