字符编码简单介绍

1. ASCII码

ASCII (American Standard Code for Information Interchange, 美国标准信息交换代码),是基于拉丁字母的一套编码系统。主要用于显示现代英语和其它西欧语言。它是现今最通用的单字节编码系统。

单个字节能够表示256个不同的字符,只是 ASCII 仅仅使用了当中低于\x80(即最高位字节为0)的一半来表示全部的英文字符以及一些控制字符,因此 ASCII 码的实际取值范围为0x000x7f之间,一共128个字符。

2. 多字节字符集MBCS

ASCII字符集中仅仅含有英文字符,不能满足其它语言的需求。于是非常多语言就制定了一套自己的编码。由于 ASCII 是单字节的,能表示的字符数量太少,因此这些编码非常多都使用多个字节来表示单个字符。比如 GBK 等。 这些编码的规则都比較类似: 假设第一个字节是\x80下面。则仍然表示 ASCII 字符,而假设是\x80以上,则跟下一个字节一起(共两个字节)表示一个字符。

IBM发明了一个叫Code Page的概念,将这些编码都收入囊中并分配页码,GBK 是第936页,也就是CP936。所以,也能够使用CP936表示 GBK

这些各种语言自己制定的编码统称 MBCS (Multi-Byte Character Set)。眼下都是用了双字节,所以有时候也称为 DBCS (Double-Byte Character Set)。

必须明白的是,MBCS 并非指某一种特定的编码,Windows里依据你设定的区域不同。MBCS 代表不同的编码,而Linux里无法使用 MBCS 作为编码。

在Windows中你看不到 MBCS 这几个字符。由于微软使用了 ANSI 这个称呼,记事本的另存为对话框里编码 ANSI 就是 MBCS

在中文简体 Windows 默认的区域设定中。ANSI 代表 GBK 编码。

3. Unicode

由于各种不同的 MBCS 编码互相不兼容。使用、转换起来非常不方便,于是便有了 Unicode

Unicode (万国码、国际码、统一码、单一码)是计算机科学领域里的一项业界标准。它对世界上大部分的文字系统进行了整理、编码,使得电脑能够用更为简单的方式来呈现和处理文字。

Unicode 发展由非营利机构统一码联盟负责,该机构致力于让Unicode方案替换既有的字符编码方案。由于既有的方案往往空间非常有限,亦不适用于多语环境。

Unicode 备受认可,并广泛地应用于电脑软件的国际化与本地化过程。有非常多新科技,如可扩展置标语言、Java编程语言以及现代的操作系统,都採用 Unicode 编码。

最初的Unicode标准UCS-2使用两个字节表示一个字符,一共能表示 256×个字符。不久后又有人认为还是太少了,于是出现了用4个字节表示一个字符的UCS-4标准。

UCS (Unicode Character Set)仅仅是字符相应码位的一张表而已。

详细怎样传输和储存字符则是由 UTF (UCS Transformation Format)来指定。

一開始直接使用 UCS 的码位来保存字符。这就是UTF-16,比方这个字的码位是6C49,则直接使用\x6C\x49保存(UTF-16-BE,BE指Big Endian),或是倒过来使用\x49\x6C保存(UTF-16-LE,LE指Little Endian)。

可是这样的保存方式在保存英文字符时,会浪费非常多存储空间( ASCII 保存一个字符仅仅须要一个字节)。于是变有了 UTF-8

UTF-8 是一种变长并且兼容 ASCII 的字符编码,在 UTF-8ASCII 字符仍然使用相同的一个字节表示。这使得原来处理 ASCII 字符的软件无须或仅仅须做少部分改动,就可以继续使用。因此,它逐渐成为电子邮件、网页及其它存储或发送文字的应用中。优先採用的编码。

UTF-8 使用一至六个字节为每一个字符编码(虽然如此。2003年11月 UTF-8RFC 3629又一次规范,仅仅能使用原来 Unicode 定义的区域。U+0000U+10FFFF。也就是说最多四个字节):

  • 128个 US-ASCII 字符仅仅需一个字节编码(Unicode 范围由U+0000U+007F).
  • 带有附加符号的拉丁文、希腊文、西里尔字母、亚美尼亚语、希伯来文、阿拉伯文、叙利亚文及它拿字母则须要两个字节编码( Unicode 范围由U+0080U+07FF)。
  • 其它基本多文种平面( BMP) 中的字符(这包括了大部分经常使用字,如大部分的汉字)使用三个字节编码(Unicode 范围由U+0800U+FFFF)。
  • 其它极少使用的 Unicode 辅助平面的字符使用四至六字节编码(Unicode 范围由U+10000U+1FFFFF使用四字节,Unicode 范围由U+200000U+3FFFFFF使用五字节,Unicode 范围由U+4000000U+7FFFFFFF使用六字节)。

对上述提及的第四种字符而言,UTF-8 使用四至六个字节来编码似乎太耗费资源了。但 UTF-8 对全部经常使用的字符都能够用三个字节表示,并且它的还有一种选择。UTF-16 编码,对前述的第四种字符相同须要四个字节来编码。所以要决定 UTF-8UTF-16 哪种编码比較有效率。还要视所使用的字符的分布范围而定。

另外值得一提的是 BOM (Byte Order Mark)。我们在储存文件时,文件使用的编码并没有保存,打开时则须要我们记住原先保存时使用的编码并使用这个编码打开,这样一来就产生了很多麻烦。UTF 则引入了 BOM 来表示自身编码,假设一開始读入的几个字节是当中之中的一个,则代表接下来要读取的文字使用的编码是相应的编码:

BOM BYTES
BOM_UTF8 \xef\xbb\xbf
BOM_UTF16_LE \xff\xfe
BOM_UTF16_BE \xfe\xff

并非全部的编辑器都会写入 BOM ,但即使没有 BOMUnicode 还是能够读取的,仅仅是像 MBCS 的编码一样。须要另行指定详细的编码。否则解码可能会失败。

绝大多数编辑器在没有BOM时都是以 UTF-8 作为默认编码读取。

即使是保存时默认使用 ANSI (MBCS)的记事本。在读取文件时也是先使用 UTF-8 測试编码。假设能够成功解码。则使用 UTF-8 解码。这个别扭的做法造成了一个BUG:假设你新建文本文件并输入姹塧然后使用 ANSI 保存。再打开就会变成 汉a

參考资料:

原文地址:https://www.cnblogs.com/zhchoutai/p/8626917.html

时间: 2024-11-01 10:40:52

字符编码简单介绍的相关文章

Base64编码简单介绍与具体实现

完整的Base64定义可见RFC 1421和RFC 2045.编码后的数据比原始数据略长,为原来的43.在电子邮件中,根据RFC 822规定,每76个字符,还需要加上一个回车换行.可以估算编码后数据长度大约为原长的135.1%. 转换的时候,将三个byte的数据,先后放入一个24bit的缓冲区中,先来的byte占高位.数据不足3byte的话,于缓冲器中剩下的bit用0补足.然后,每次取出6(因为26=64)个bit,按照其值选择ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefgh

精述字符编码(读这篇绝对不够)

带你了解ASCII,Latin1,ANSI,Unicode,UCS-2,UCS-4,UTF-8,UTF-16,UTF-32,GB2312,GB13000,GBK,GB18030,BIG5,BOM,BMP,Littile Endian,Big Endian,内码,外码,CodePage. 1.导语 字符编码(Character Encoding)是计算机显示文本的基础,是每一位IT从业者必知的计算机基础知识点,如同数值在计算中如何存储表示,那么基础,那么重要.然因字符编码历史久远,变更频繁,地域差

python之旅:数据类型、字符编码、文件处理

一 引子 1 什么是数据? x=10,10是我们要存储的数据 2 为何数据要分不同的类型 数据是用来表示状态的,不同的状态就应该用不同的类型的数据去表示 3 数据类型 数字(整形,长整形,浮点型,复数) 字符串 字节串:在介绍字符编码时介绍字节bytes类型 列表 元组 字典 集合 4 按照以下几个点展开数据类型的学习 #一:基本使用 1 用途 2 定义方式 3 常用操作+内置的方法 #二:该类型总结 1 存一个值or存多个值 只能存一个值 可以存多个值,值都可以是什么类型 2 有序or无序 3

python day 2 数据类型、字符编码、文件处理

一 引子 1 什么是数据? x=10,10是我们要存储的数据 2 为何数据要分不同的类型 数据是用来表示状态的,不同的状态就应该用不同的类型的数据去表示 3 数据类型 数字(整形,长整形,浮点型,复数) 字符串 字节串:在介绍字符编码时介绍字节bytes类型 列表 元组 字典 集合 4 按照以下几个点展开数据类型的学习 #一:基本使用1 用途2 定义方式3 常用操作+内置的方法#二:该类型总结1 存一个值or存多个值     只能存一个值     可以存多个值,值都可以是什么类型2 有序or无序

字符编码的前世今生

文章来源:字符编码的前世今生 因为"字符编码"这个话题牵涉到的历史久远.机构众多.专业术语较多.所以本篇文章可能会略长,为了避免内容过于枯燥.我会尽量用一种通俗易懂的语言来写这篇文章. 当中本文的第一篇章会对历史中的主要字符编码进行介绍.因为篇幅较长,假设读者对此已非常了解.可直接跳过进行第二章的阅读. 完毕本篇文章的过程中參考和阅读了大量的文章和文献,写本篇文章的目的一是让自己对"字符编码"可以做一个较深的理解.二是希望给以前徘徊或正在徘徊在编码困惑中的前端们一个

NIO之Charset类字符编码对象

Charset类字符编码对象 介绍 java中使用Charset来表示编码对象 This class defines methods for creating decoders and encoders and for retrieving the various names associated with a charset. Instances of this class are immutable. This class also defines static methods for te

数据类型,字符编码,文件处理

1.数据类型: 数字(整型,长整型,浮点型,复数) 字符串:在介绍字符编码时介绍字节bytes类型 列表 元祖 字典 集合 2.整型 int 作用:年级/等级/身份证号等整型数字相关 定义: age=10 本质上age=int(10) 十进制转成...进制 print(bin(13)) #将整型转变成二进制 print(oct(13)) #将整型转变成八进制 print(hex(13)) #将整型转变成十六进制 常用操作+内置方法 # 存一个值 # 不可变 # x=10 # print(id(x

06 Python字符编码与文件处理

python垃圾回收机制: python中的垃圾回收机制是以引用计数为主,分代收集为辅,引用计数的缺陷是循环引用的问题,一个对象的引用数为0 ,那么这个对象就会被python虚拟机回收内存 字符编码 字符编码的介绍 计算机存放的都是二级制数字,我们输入一个字符,计算机是不认识的,那么就需要一个编码表,吧我们写入的字符转换为二级制数,然后将输入字符对应的二进制数写入内存,再由内存写入硬盘 在这之间只有一种编码表 ASCII:只能表示英文字符,用1Bytes对应一个英文字符 内存:ASCII 硬盘:

字符编码介绍及不同编码区别

UNICODE,GBK,UTF-8区别 简单来说,unicode,gbk和大五码就是编码的值,而utf-8,uft-16之类就是这个值的表现形式.而前面那三种编码是一兼容的,同一个汉字,那三个码值是完全不一样的.如"汉"的uncode值与gbk就是不一样的,假设uncode为a040,gbk为b030,而uft-8码,就是把那个值表现的形式.utf-8码完全只针对uncode来组织的,如果GBK要转UTF-8必须先转uncode码,再转utf-8就OK了. 详细的就见下面转的这篇文章. 谈谈Un