ASCI, GB2312, UNICODE, UTF8编码比较

最近工作中一直用到编码转换,搞的糊里糊涂的。其实以前也搞过一次,后来长时间不用,又忘了,这次花点时间用烂笔头把它记下来。


<b>ASCII码</b>
在C语言中ASCII表示为char,占一个字节,共8位。因此ANCII共可以表示256个字符。对于英语字符和二进制之间的映射足够了,但对于其他非英语语言,远远不够。


<b>GB2312</b>
采用EUC存储方法,兼容ASCII。即,ASCII字符范围为0x21-0x7E,直接用单字节表示。这是码集0。每个汉字采用2个字节表示。第一个字节称为高字节,第二个字节为低字节。“高位字节”使用了0xA1-0xF7,“低位字节”使用了0xA1-0xFE。
ref: 
1, http://zh.wikipedia.org/wiki/GB_2312
2, http://zh.wikipedia.org/wiki/EUC



<b>Unicode</b>
Unicode是计算机科学领域里的一项业界标准。它对世界上大部分的文字系统进行了整理、编码,使得计算机可以用更为简单的方式来呈现和处理文字。


Unicode编码系统分为 编码方式 和 实现方式 两个层次。

编码方式:
目前实际应用的编码版本为UCS-2,即16位的码空间。每个字符占用2个字节,可以表示65536个字符。将来会采用UCS-4,采用32位的码空间,占用4个字节。

实现方式:
Unicode的实现方式不同于编码方式。一个字符的Unicode编码是确定的。但是在实际传输过程中,由于不同系统平台的设计不一定一致,以及出于节省空间的目的,对Unicode编码的实现方式有所不同。Unicode的实现方式称为Unicode转换格式(Unicode Transformation Format,简称为UTF)。

ref:
1,http://zh.wikipedia.org/wiki/Unicode




<b>UTF8</b>
UTF-8(8-bit Unicode Transformation Format)是一种针对Unicode的可变长度字符编码,也是一种前缀码。它可以用来表示Unicode标准中的任何字符,且其编码中的


第一个字节仍与ASCII兼容,这使得原来处理ASCII字符的软件无须或只须做少部份修改,即可继续使用。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编码非常简单。如果一个字节的第一位是0,则这个字节单独就是一个字符;如果第一位是1,则连续有多少个1,就表示当前字符占用多少个字节。

ref:
1, http://zh.wikipedia.org/wiki/UTF-8



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

实践:

1, 在Notepad中存储以下内容:
129
一丁丰


2, 另存为Notepad支持的几种编码:ANSI, Unicode, UTF8。
p.s. 
<b>ANSI</b>
实际上,在简体中文系统下,ANSI 编码代表 GB2312 编码。
参考自:http://baike.baidu.com/view/1273097.htm


3, 使用UltraEdit或VIM二进制编码查看具体内容(VIM命令模式下输入%!xxd查看二进制,%!xxd -r返回原状态)。


4,对比
<b>Unicode</b>
3100 3200 3900 0d00 0a00 004e 014e 304e


1:   0031
2:   0032
9:   0039
\r:  000d
\n:  00a0
一: 4E00
丁: 4E01
丰: 4E30


Unicode中文编码表,参考:http://www.chi2ko.com/tool/CJK.htm

<b>UFT8</b>
efbb bf31 3239 0d0a e4b8 80e4 b881 e4b8 b00d 0a


UTF8-BOM: efbb bf
p.s.
UTF-8 不需要 BOM,尽管 Unicode 标准允许在 UTF-8 中使用 BOM。所以不含 BOM 的 UTF-8 才是标准形式,在 UTF-8 文件中放置 BOM 主要是微软的习惯(顺便提一下:把带有 BOM 的小端序 UTF-16 称作「Unicode」而又不详细说明,这也是微软的习惯)。BOM(byte order mark)是为 UTF-16 和 UTF-32 准备的,用于标记字节序(byte order)。微软在 UTF-8 中使用 BOM 是因为这样可以把 UTF-8 和 ASCII 等编码明确区分开,但这样的文件在 Windows 之外的操作系统里会带来问题。


1:   31
2:   32
9:   39
\r:  0d
\n:  0a
一: E4 B8 80
丁: E4 B8 81
丰: E4 B8 B0


示例.
‘丰’的 Unicode 编码是4E30, 对应的二进制为:0100 1110 0011 0000,把Unicode转换成UTF8, 3字节版的1110xxxx 10xxxxxx 10xxxxxx,即1110 0100 1011 1000 1011 0000,对应的16进制为E4 B8 B0。


<b>ANSI</b>
3132 390d 0ad2 bbb6 a1b7 e10d 0a


GB2312中文编码:
1:  31
2:  32
9:  39
\r: 0d
\n: 0a
一:D2BB
丁:B6A1
丰:B7A1


参考文献:
1, http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值