字符编码理解

来源:互联网 发布:淘宝卖家感谢信怎么写 编辑:程序博客网 时间:2024/05/18 02:03

自己没有对编码做过多的探讨和学习,主要参考两篇博文,已经可以很好的理解什么是字符编码,以及字符编码的使用等问题。
两篇博文地址:
http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html,
http://www.ibm.com/developerworks/cn/java/j-lo-chinesecoding/,
https://www.ibm.com/developerworks/cn/java/j-lo-javaio/


现在总结下自己的学习认识,如下:
1,为什么要编码
首先要认识下,在计算机存储和传输中, 都是用字节(0,1)存储和传输,包括本地磁盘和网络空间,
但人们为了简便操作计算机,引入了字符概念。
字符就是人们语言符号,因为语言有多种,所以也引入多种字符集,包括ASCII,GB2312, GBK, Unicode和UTF-8等;

其中计算机处理的最小单位是一个字节(8位);

2,简单介绍几种常见字符集

ASCII:单字节编码,总共有 128 个,用一个字节的低 7 位表示,0~31 是控制字符如换行回车删除等;32~126 是打印字符,可以通过键盘输入并且能够显示出来。
ISO-8859-1:扩展 ASCII 编码,单字节编码,它总共能表示 256 个字符。涵盖了大多数西欧语言字符;
GB2312:双字节编码,总的编码范围是 A1-F7,其中从 A1-A9 是符号区,总共包含 682 个符号,从 B0-F7 是汉字区,包含 6763 个汉字。
GBK:扩展 GB2312,双字节编码,增加更多字符,比如繁体字符。
UTF-8:采用了一种变长技术,每个编码区域有不同的字码长度。不同类型的字符可以是由 1~4 个字节组成。
Unicode:统一码,只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储;UTF-8是Unicode的实现方式之一。Unicode规范中定义,每一个文件的最前面分别加入一个表示编码顺序的字符,这个字符的名字叫做"零宽度非换行空格"(ZERO WIDTH NO-BREAK SPACE),用FEFF表示。这正好是两个字节,而且FF比FE大1。
如果一个文本文件的头两个字节是FE FF,就表示该文件采用大头方式;如果头两个字节是FF FE,就表示该文件采用小头方式。
3,编码的两个角度分类
准对JAVA IO操作,有下面两组分类:
a,基于字节操作的 I/O 接口:InputStream 和 OutputStream
b,基于字符操作的 I/O 接口:Writer 和 Reader
c,基于磁盘操作的 I/O 接口:File
d,基于网络操作的 I/O 接口:Socket
前两组主要是根据传输数据的数据格式,后两组主要是根据传输数据的方式;
4,JAVA的内存存储也是16位,二进制存储方式;
5,编码选择:
对中文字符后面四种编码格式都能处理,GB2312 与 GBK 编码规则类似,但是 GBK 范围更大,它能处理所有汉字字符,
所以 GB2312 与 GBK 比较应该选择 GBK。
UTF-16 与 UTF-8 都是处理 Unicode 编码,它们的编码规则不太相同,相对来说 UTF-16 编码效率最高,
字符到字节相互转换更简单,进行字符串操作也更好。它适合在本地磁盘和内存之间使用,
可以进行字符和字节之间快速切换,如 Java 的内存编码就是采用 UTF-16 编码。但是它不适合在网络之间传输,
因为网络传输容易损坏字节流,一旦字节流损坏将很难恢复,想比较而言 UTF-8 更适合网络传输,
对 ASCII 字符采用单字节存储,另外单个字符损坏也不会影响后面其它字符,
在编码效率上介于 GBK 和 UTF-16 之间,所以 UTF-8 在编码效率上和编码安全性上做了平衡,是理想的中文编码方式。


原创粉丝点击