电脑中一个字符大都用八位数的二进制数字表示,标准的ANSI编码规范规定0~127总共128个数字代表信息(字母,数字,标点,控制码,空格等),剩下没用到的128个编码没用做规定,不同国家地区制定了不同的标准,由此产生了GB2312,BIG5以及JIS等各自的编码标准。这些使用 2 个字节(0x80~0xFF范围内)来代表一个字符的各种汉字延伸编码方式,称为 ANSI 编码。在简体中文系统下,ANSI 编码代表 GB2312 编码,在日文操作系统下,ANSI 编码代表 JIS 编码。不同 ANSI 编码之间互不兼容,当信息在国际间交流时,无法将属于两种语言的文字,存储在同一段 ANSI 编码的文本中。
ISO-8859-1(2,3...)是欧美以及拉丁地区的编码方式,通过使用剩下的128位来扩充自己国家语言的编码
事实证明,对可以用ASCII表示的字符使用UNICODE并不高效,因为UNICODE比ASCII占用大一倍的空间
我们通过UrlEncode函数即可得到汉字的编码,比如对ANSI编码的asp代码,和UTF-8编码的asp代码执行urlecode得到的结果就不一样。
<% Response.Write(Server.URLpathencode("花心")) ' 得到 %BB%A8%D0%C4 %>上面是ANSI编码的文本,下面是UTF-8编码的代码文件,编码结果大不一样
<% Response.Write(Server.URLEncode("花心")) ' 得到 %E8%8A%B1%E5%BF%83 %>同样针对ANSI编码的php脚本和UTF-8编码的脚本调用同样的函数也是不同结果
<?php echo urlencode("花心"); // %BB%A8%D0%C4 ?>
<?php echo urlencode("花心"); // E8%8A%B1%E5%BF%83 ?>针对某种编码encode后的结果需要用同样编码的文本格式解码才可读,不然就是一堆乱码。所以我们在程序中最好做到编码统一,比如统一使用utf8这种全球通用包含各种语言文字的编码。
下面再看看ansi,unicode,unicode big endian,utf8编码的文件用十六进制打开的样子:同样的文本“a花心”
ANSI 61 BB A8 D0 C4 UNICODE FF FE 61 00 B1 82 C3 5F UNICODE-BIG-ENDIAN FE FF 00 61 82 B1 5F C3 UTF-8 EF BB BF 61 E8 8A B1 E5 BF 83
可以看出第一种编码方式全部都是文本信息,后面三种都有头部表示自己的信息,所以ANSI中也没有用FE FF来编码的汉字(为了不冲突)UNICODE中对字母的编码也是采用了2个字符,增加了冗余。我们比较ANSI和UTF-8编码的格式,可以看到正好就是我们urlencode后的结果。