字符编码简明教程

31 篇文章 4 订阅
字符编码简明教程

前言

之前写了个,极其详尽的,关于字符编码的教程:

字符编码详解

由于内容太多,所以,新手学习起来,相对比较耗时和繁琐。

此处,为了更方便的,快速学习和了解,我们,尤其是中国人,相对常见的那些字符编码:

GB2312,GBK,GB18030

以及其他在编程实践中比较容易遇到的:
ASCII,UTF-8,Unicode,ISO8859-1

以及,其他一些,也需要稍微了解一下的

繁体中文的BIG5

等编码,以及这些编码之间的逻辑关系。

所以,特此专门,去写个,相对篇幅不长的,容易理解和看懂的,关于字符编码的简明教程。

 

换句话说:

如果只是想要了解常见的字符编码,则看看此文,就差不多了;

如果想要了解详细的,关于每个字符编码的编码逻辑等细节内容,还是需要去看:字符编码详解

 

此文的目的,只是为了第一点:让不熟悉字符编码的人,看了此文,对于各种字符编码,有个基本的了解。

 

字符编码ASCII简介

计算机中,目前用的最广泛,也是最基本的,算是ASCII字符编码了。

对于ASCII的简单总结就是:

ASCII就是我们最常见的,26个英文字母,加上常见的那些字符等等,加起来的,字符编码。

而对于这些字符,很容易理解,也在其他字符编码中出现,比如简体中文字符,繁体中文字符,西欧字符,Unicode等等,

所以,可以理解为:

ASCII,就是其他各种字符编码,所共有的最小集合,是其他字符编码的始祖。

对于ASCII的具体所含内容,可以总结为:

ASCII字符集共27个字符
=128个字符
= 33个控制字符 + 95个可见字符
=33个控制字符 + (26个英文字母 + 常见的符号)
=NULL,…,CR,LF,VT,FF,…Space,Delete + (abc…xyzABC…XYZ + !”#$…[]\^_…)

 

简体中文字符编码简介

简体中文的发展历史,以此是:

1980年,国标指定的GB2312-80,简称GB2312,对应着微软最早的CP936

1993年,国标,借鉴Unicode 1.1,再收录中国大陆、台湾、日本及韩国通用字符集的汉字,指定出国标:GB 13000.1-93,简称GB13000;

微软对于GB2312做了扩展,利用GB2312未使用的编码空间,加进去GB13000和Unicode1.1的字符,制定了GBK,对应着,微软的现在的CP936

2000年,中国,额外又收录了藏文、蒙文、维吾尔文等主要的少数民族文字,出了国标GB18030-2000,简称GB18030,对应着微软的CP54936

 

对于这几个字符集的关系是:

从编码的兼容性上:

GB2312,GBK,GB18030,是兼容的,包含的字符个数,以此更多,可以写成:

GB2312 < GBK < GB18030

 

从包含的字符个数上:

GB13000和GBK基本上是一样的(但是编码不兼容)

 

中文编码和微软的代码页的关系是:

GB2312==旧的CP936

GBK==新的CP936

GB18030==CP54936

 

中文字符编码在应用中的情况

此处,简单说说,据我所知的,中文字符编码,在实际使用中的情况:

网页中的编码,一般是通过charset指定的;

很多中文网页,charset用的GB2312;

但是部分网页,所声明的编码和实际编码不同:

虽然charset指定的是GB2312,但是实际上用的是(包含了更多字符的)GBK;

导致的情况是:

如果你按照GB2312去解码,由于部分字符是属于GBK的,而非GB2312,则会出现解码失败

解决办法是:

尝试用GBK,或包含更多字符的GB18030去解码,则一般都可以正常解码的。

 

相关内容:

【整理】关于HTML网页源码的字符编码(charset)格式(GB2312,GBK,UTF-8,ISO8859-1等)的解释

 

繁体中文字符编码简介

上面的GB2312,GBK,GB18030,都是针对于中国大陆的,简体中文;

对于台湾等地区,都是用的是繁体中文,其和我们的编码不同;

繁体中文一般都是用的是BIG5,中文一般称为大五码,其对应者微软的CP950;

 

西欧字符编码简介

欧洲包含很多国家和地区,按照地域,大概可分为,西欧,中欧,南欧,北欧,等等;

此处,在字符编码上,为了实现欧洲,如此多种的地区和语系,支持其所用的字符,然后发展处一个国际标准,叫做ISO/IEC 8859,简称ISO8859

ISO8859,其下分了很多分支,从1到15,分别叫做ISO8859-1,ISO8859-2,……,ISO8859-15

可以说:ISO8859,包含了整个欧洲所用的各种字符;

其中,最最常用的,就是:ISO8859-1,又常被称为Latin-1,表示的就是西欧字符;

 

ISO8859-1的实际使用情况

此处,简单说说,我之前所了解到的,ISO8859-1的使用情况。

很多网页编码,尤其是和西欧相关的,比如德文或者西欧某国家的类似的其他的网页,很多都是用的是ISO8859-1

 

相关内容:

1. 注意,实际上,ISO 8859和ISO-8859,不是同一个东西,是有点细微差别的,详见:

2.2.2.5. ISO 8859和ISO-8859的区别和联系

2.另外:

  • ISO8859-2:Latin-2,中欧语言
  • ISO8859-3:Latin-3,南欧语言
  • ISO8859-4:Latin-4,北欧语言

更多内容可参考:

A.2. ISO/IEC 8859编码标准中的15种字符集

 

大一统的编码:Unicode

字符编码发展到最后,要考虑的问题是:

最好用,单独的,某个字符编码,可以囊括世界上所有的字符,包括以后可能出现的字符

此种编码,就是后来的Unicode。

Unicode,版本上,主要有之前的Unicode 1.1和最新的Unicode 2.0;

 

Unicode的字符编码逻辑

Unicode编码目前有两种,UCS-2和UCS-4;

目前最常用的是UCS-2,即用2个字节=2个Byte=16个bit=16位,来表示字符。

理论上,最多可以表示2^16=65536个=6万多个字符,足够支持目前世界上所有的字符了。

 

Unicode和UTF-8,UTF-16等的关系

需要了解的是:

Unicode,只是一个字符集的概念,即表示,设计了一套逻辑,可以用不同的值,表示不同的字符,这个是Unicode标准做的事情,即支持了所有的字符;

但是,要把Unicode,在计算机中实现出来,表示出来,以及把Unicode字符,从从一个地方发送到别的地方,即字符交换,方面,则涉及到,实际上所采用的字符编码;

把字符集Unicode表示出来的字符编码,有多种,最常见的有,UTF-8和UTF-16,次常见的还有UTF-32。

即:

Unicode是字符集的概念,UTF-8,UTF-16是字符编码的概念;

UTF-8,UTF-16等,只是Unicode的实现方式之一。

 

UTF-8简介

明白了Unicode和UTF-8的关系后,再来说说,UTF-8这个字符编码的逻辑:

UTF-8是一种变长的编码方式,可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。

UTF-8的编码规则很简单,只有二条:

  • 对于单字节的符号,字节的第一位设为0,后面7位为这个符号的Unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的
  • 对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的Unicode码

下表总结了编码规则,字母x表示可用编码的位。

Unicode与UTF-8之间的编码映射关系

Unicode符号范围(十六进制)UTF-8编码方式(二进制)
0000 0000-0000 007F0xxxxxxx
0000 0080-0000 07FF110xxxxx 10xxxxxx
0000 0800-0000 FFFF1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

举例:

以汉字“严”为例,演示如何实现UTF-8编码:

“严”的Unicode是4E25,介于00008000到0000FFF之间,根据上表,“严”的UTF-8编码格式是“1110xxxx 10xxxxxx 10xxxxxx”。

然后,从“严”的最后一个二进制位开始,依次从后向前填入格式中的x,多出的位补0。

这样就得到了,“严”的UTF-8编码是 “11100100 10111000 10100101”,转换成十六进制就是E4B8A5。

 

注意:

UTF-8,是标准的写法,其他也有别人写成UTF8的,但是很多程序,是不识别此种非标准写法的。

以后,最好还是用UTF-8,这个名字。

 

常见字符编码的关系图解

下面,就用一个图表,来解释,各种常见字符编码之间的逻辑关系:

 

charset develop history chart

对于此图,再简单解释一下:

  • ASCII是最基本的,最早的,用的最广泛的,字符编码
    • 但是只支持普通的基本字符,即常见英文字母,数字,下划线等
  • 简体中文的编码
    • 发展路径以此是:GB2312 < GBK < GB18030
    • 对应的所包含的字符个数,也是以此增加
  • 繁体中文的编码
    • 最常见的是BIG5
  • 西欧字符编码
    • 最常用的就是ISO8895-1
      • ISO8859是从1到15,是一系列的编码
      • ISO8859-1是属于ISO8859系列编码其下的,但是用的最广泛的的
  • 统一了世界上所有字符的Unicode
    • Unicode,可以叫做大一统的编码,包含了世界上所有的字符
    • 但是Unicode只是字符编码集
      • 字符(编码)集,只表示包含了哪些字符
      • 字符编码,表示了用何种方式去表示此字符集
      • Unicode这个字符集,可以有多种字符编码表示出来,最常见的包括UTF-8,UTF-16,UTF-32等等
      • 最最常用的是UTF-8

 

总结各种常见字符编码的使用情况

此处,简单总结一下,关于各种编码的使用方面的情况:

  • 各种情况下,包括程序代码中处理字符,文件内容所用字符编码,网页中的charset,最最常用的,要属UTF-8
  • 对于中文方面,相对比较常用的是GBK
    • 其次,也还是有很多之前的中文网页用GB2312的
  • 西欧等字符和网页,多数使用ISO8859-1
  • 繁体中文,一般用BIG5

原文链接:http://www.crifan.com/character_encoding_charset_simpile_tutorial/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目录 缩略词 正文之前 1. 目的 2. 本文内容 3. 声明 1. 字符编码相关的背景知识 1.1. 拉丁字母 1.1.1. 我们的目标 1.2. 什么是字符编码 2. 字符编码标准 2.1. 只支持基本的拉丁字符字符编码:ASCII 2.1.1. ASCII的由来 2.1.2. ASCII编码规则 2.1.2.1. ASCII字符集中的功能/控制字符 2.1.2.1.1. 什么是Function Code功能码或 Function Character功能字符 2.1.2.1.2. ASCII中的Function/Control Code功能字符的详细含义 2.1.2.1.2.1. 0 – NUL – NULl 字符/空字符 2.1.2.1.2.2. 1 – SOH – Start Of Heading 标题开始 2.1.2.1.2.3. 2 – STX,3 – ETX 2.1.2.1.2.4. 4 – EOT – End Of Transmission 传输结束 2.1.2.1.2.5. 5 – ENQ – ENQuiry 请求 2.1.2.1.2.6. 6 – ACK – ACKnowledgment 回应/响应 2.1.2.1.2.7. 7 – BEL – [audible] BELl 2.1.2.1.2.8. 8 – BS – BackSpace 退格键 2.1.2.1.2.9. 9 – HT – Horizontal Tab 水平制表符 2.1.2.1.2.10. 10 – LF – Line Feed 换行 2.1.2.1.2.11. 11 – VT – Vertical Tab 垂直制表符 2.1.2.1.2.12. 12 – FF – Form Feed 换页 2.1.2.1.2.13. 13 – CR – Carriage return 机器的滑动部分/底座 返回 -> 回车 2.1.2.1.2.14. 14 – SO,15 – SI 2.1.2.1.2.15. 16 – DLE – Data Link Escape 数据链路转义 2.1.2.1.2.16. 17 – DC1 – Device Control 1 / XON – Transmission on 2.1.2.1.2.17. 18 – DC2 – Device Control 2 2.1.2.1.2.18. 19 – DC3 – Device Control 3 / XOFF – Transmission off 传输中断 2.1.2.1.2.19. 20 – DC4 – Device Control 4 2.1.2.1.2.20. 21 – NAK – Negative AcKnowledgment 负面响应-> 无响应, 非正常响应 2.1.2.1.2.21. 22 – SYN – SYNchronous idle 2.1.2.1.2.22. 23 – ETB – End of Transmission Block 块传输中止 2.1.2.1.2.23. 24 – CAN – CANcel 取消 2.1.2.1.2.24. 25 – EM – End of Medium 已到介质末端,介质存储已满 2.1.2.1.2.25. 26 – SUB – SUBstitute character替补/替换 2.1.2.1.2.26. 27 – ESC – ESCape 逃离/取消 2.1.2.1.2.27. 28 – FS – File Separator 文件分隔符 2.1.2.1.2.28. 29 – GS – Group Separator分组符 2.1.2.1.2.29. 30 – RS – Record Separator记录分隔符 2.1.2.1.2.30. 31 – US – Unit Separator 单元分隔符 2.1.2.1.2.31. 32 – SP – White SPace 空格键 2.1.2.1.2.32. 127 – DEL – DELete 删除 2.1.2.1.3. 各种字符的标准的读法/叫法 2.1.3. ISO 646 2.2. 支持多种衍生拉丁字母的字符编码:EASCII和ISO 8859 2.2.1. EASCII 2.2.2. ISO 8859 2.2.2.1. ISO/IEC 8859出现的背景 2.2.2.2. ISO/IEC 8859的编码规则 2.2.2.3. ISO/IEC 8859的特点 2.2.2.4. ISO/IEC 6429 2.2.2.5. ISO 8859和ISO-8859的区别和联系 2.2.2.5.1. 原先的ISO 8859-1和我们常说的ISO 8859-1 2.3.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值