分享

Computer:字符编码(ASCII编码/GBK编码/BASE64编码/UTF-8编码)的简介、案例应用(python中的编码格式及常见编码问题详解)之详细攻略

 处女座的程序猿 2022-09-13 发布于上海

Computer:字符编码(ASCII编码/GBK编码/BASE64编码/UTF-8编码)的简介、案例应用(python中的编码格式及常见编码问题详解)之详细攻略


符串编码(ASCII编码/GBK编码/BASE64编码/UTF-8编码)的简介

         符编码(Character encoding)也称字集码,是把字符集中的字符编码为指定集合中某一对象(例如:比特模式、自然数序列、8位组或者电脉冲),以便文本在计算机中存储和通过通信网络的传递。常见的例子包括将拉丁字母表编码成摩斯电码和ASCII。其中,ASCII将字母、数字和其它符号编号,并用7比特的二进制来表示这个整数。通常会额外使用一个扩充的比特,以便于以1个字节的方式存储。
         在计算机技术发展的早期,如ASCII(1963年)和EBCDIC(1964年)这样的字符集逐渐成为标准。但这些字符集的局限很快就变得明显,于是人们开发了许多方法来扩展它们。对于支持包括东亚CJK字符家族在内的写作系统的要求能支持更大量的字符,并且需要一种系统而不是临时的方法实现这些字符的编码。

1、案例理解编码的原理

         在显示器上看见的文字、图片等信息在电脑里面其实并不是我们看见的样子,即使你知道所有信息都存储在硬盘里,把它拆开也看不见里面有任何东西,只有些盘片
         假设,你用显微镜把盘片放大,会看见盘片表面凹凸不平,凸起的地方被磁化,凹的地方是没有被磁化;凸起的地方代表数字1,凹的地方代表数字0。硬盘只能用0和1来表示所有文字、图片等信息
         那么字母”A”在硬盘上是如何存储的呢?可能小张计算机存储字母”A”是1100001,而小王存储字母”A”是11000010,这样双方交换信息时就会误解。比如小张把1100001发送给小王,小王并不认为1100001是字母”A”,可能认为这是字母”X”,于是小王在用记事本访问存储在硬盘上的1100001时,在屏幕上显示的就是字母”X”。
         也就是说,小张和小王使用了不同的编码表。小张用的编码表是ASCII,ASCII编码表把26个字母都一一的对应到进制1和0上;小王用的编码表可能是EBCDIC,只不过EBCDIC编码与ASCII编码中的字母和01的对应关系不同。

以上源自百度百科字符编码_百度百科

2、不同编码对比

字符编码

时间

简介

ASCII编码

1961

ASCII 是 American Standard Code for Information Interchange 的缩写,美国(国家)信息交换标准(代)码,一种使用7个或8个二进制位进行编码的方案,最多可以给256个字符(包括字母、数字、标点符号、控制字符及其他符号)分配(或指定)数值。

基本的 ASCII 字符集共有 128 个字符,其中有 96 个可打印字符,包括常用的字母、数字、标点符号等,另外还有 32 个控制字符

(1)、一个字节,255字符。米国人在设计这个编码的时候,以为世界上只有英语一种语言,所以足够表达26个字母+9个数字+各种标点符号了。ASCII 码使用指定的7 位或8 位二进制数组合来表示128 或256 种可能的字符

(2)、主要用于显示现代英语和其他西欧语言。它是现今最通用的单字节编码系统。

MBCS编码/ANSI 编码

为了扩充ASCII编码,以用于显示本国的语言,不同的国家和地区制定了不同的标准,由此产生了 GB2312, BIG5, JIS 等各自的编码标准。这些使用 2 个字节来代表一个字符的各种汉字延伸编码方式,称为 ANSI 编码,又称为"MBCS(Muilti-Bytes Character Set,多字节字符集)"。在简体中文系统下,ANSI 编码代表 GB2312 编码,在日文操作系统下,ANSI 编码代表 JIS 编码,所以在中文 windows下要转码成gb2312,gbk只需要把文本保存为ANSI 编码即可。

在简体中文系统下,ANSI 编码代表 GB2312 编码,在日文操作系统下,ANSI 编码代表 JIS 编码。

GB2312编码

1980

GB2312 也是ANSI编码里的一种,对ANSI编码最初始的ASCII编码进行扩充,为了满足国内在计算机中使用汉字的需要,中国国家标准总局发布了一系列的汉字字符集国家标准编码,统称为GB码,或国标码。

(1)、GB2312编码通行于我国内陆;新加坡等地也采用此编码。几乎所有的中文系统和国际化的软件都支持GB 2312。

-------------------------------------------------------------

GB 2312的出现,基本满足了汉字的计算机处理需要,但对于人名、古汉语等方面出现的罕用字,GB 2312不能处理,这导致了后来GBK及GB 18030汉字字符集的出现。

GBK编码

1980

GBK即汉字内码扩展规范,K为扩展的汉语拼音中“扩”字的声母。英文全称Chinese Internal Code Specification。GBK编码标准兼容GB2312,共收录汉字21003个、符号883个,并提供1894个造字码位,简、繁体字融于一库。GB2312码是中华人民共和国国家汉字信息交换用编码。

两个字节,GB2312(6000常用字)→GB18030(2W+字)。

(1)、Windows系统默认编码格式,windows系统默认编码为GBK;

BASE64编码

为了能让邮件系统正常的收发信件,就需要把由其他编码存储的符号转换成ASCII码来传输。比如,在一端发送GB2312编码->根据Base64规则->转换成ASCII码,接收端收到ASCII码->根据Base64规则->还原到GB2312编码。

UNICODE编码

世界上存在着多种编码方式,在ANSi编码下,同一个编码值,在不同的编码体系里代表着不同的字。在简体中文系统下,ANSI 编码代表 GB2312 编码,在日文操作系统下,ANSI 编码代表 JIS 编码,可能最终显示的是中文,也可能显示的是日文。对同一个二进制编码值进行显示,采用了不同的编码,导致乱码。这个问题促使了unicode码的诞生

如果有一种编码,将世界上所有的符号都纳入其中,无论是英文、日文、还是中文等,大家都使用这个编码表,就不会出现编码不匹配现象Unicode固然统一了编码方式,但是它的效率不高。

UTF-8编码

为了提高Unicode的编码效率,于是就出现了UTF-8编码。UTF-8可以根据不同的符号自动选择编码的长短。比如英文字母可以只用1个字节就够了。

两个字节ISO ,国际标准化组织。unicode指的是万国码,是一种“字码表”,而utf-8是这种字码表储存的其中一种编码方法。把多国语言都统一到一套编码,其中UTF-8编码节省空间,还有UTF-16、UTF-32。

(1)、Linux系统的Ubuntu默认为UTF-8;

(2)、PyQt软件中默认的编码格式;

python中的编码格式及常见编码问题详解

Python2默认的编码是ASCII,而Python3默认的是utf-8。
(1)、Python中字符串类型分为byte string 和 unicode string两种。
(2)、Python进行同时包含 str 与 unicode 的运算时,Python 一律都把 str 转换成 unicode 再运算,当然,运算结果也都是 unicode。由于 Python 事先并不知道 str 的编码,它只能使用 sys.getdefaultencoding() 编码去 decode。
(3)、一般情况下,sys.getdefaultencoding() 的值总是 'ascii' ——显然,如果需要转换的 str 有中文,一定会出现错误。对于这个问题,建议在代码里的中文字符串前写上 u。
(4)、在 Python 3 已经取消了 str,让所有的字符串都是 unicode,这也许是个正确的决定。

1、查看、设置python默认编码

import sys
res = sys.getdefaultencoding()   
#sys.setdefaultencoding('utf-8')设置默认格式为utf8
print(res)

2、如果默认是ascii编码,输出中文时,肯定出现编码错误

将输出的字符串转为unicode编码,或者格式化为unicode编码,然后输出

my_str = self.lineEdit.text()
self.textBrowser.append(my_str)
print(unicode(self.lineEdit.text()))

my_str = self.lineEdit.text()
self.textBrowser.append(my_str)
print(u'%s'%self.lineEdit.text())

3、解决输出字符串乱码问题

f = open(unicode(my_file), 'a+')
f.write(unicode(my_data).encode('utf8'))

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多