首页 > 代码库 > 关于字符编码
关于字符编码
ANSI有很多代码页,使用不同代码页的内码无法在其他代码也正常显示,这就是为什么日文版/繁体中文版游戏无法在简体中文平台直接显示的原因.
Unicode也是一种字符编码方法,不过它是由国际组织设计,可以容纳全世界所有语言文字的编码方案.它是一种2字节编码,能够提供65536个字符,这个数字是不够表示所有的字符的(汉语就有55000多字符),所以,通过一个代理对的机制来实现附加的917,476个字符表示,以达到所有字符都具有唯一编码.
ASCII(跟ANSI不一样)是用来表示英文字符的一种编码规范,每个ASCII字符占用1个字节(8bits),显然是不够的
于是,Unicode诞生了,它固定使用16 bits(两个字节、一个字)来表示一个字符,共可以表示65536个字符。将世界上几乎所有语言的常用字符收录其中,方便了信息交流
UTF-8是Unicode的一种方式,是8位元格式的,因为UTF-8可以和ASCII编码保持最大程度的兼容
UTF-8与UNICODE对应的方式如下:
对于某一个字符的UTF-8编码,如果只有一个字节则其最高二进制位为0;如果是多字节,其第一个字节从最高位开始,连续的二进制位值为1的个数决定了其编码的位数,其余各字节均以10开头。UTF-8最多可用到6个字节。
如表:
1字节 0xxxxxxx
2字节 110xxxxx 10xxxxxx
3字节 1110xxxx 10xxxxxx 10xxxxxx
4字节 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
5字节 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
6字节 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
因此UTF-8中可以用来表示字符编码的实际位数最多有31位,即上表中x所表示的位。除去那些控制位(每字节开头的10等),这些x表示的位与UNICODE编码是一一对应的
二进制:11000000 10110001
对比两个字节编码的表示方式:
110xxxxx 10xxxxxx
提取出对应的UNICODE编码:
00000 110001
Ansi字符串我们最熟悉,英文占一个字节,汉字2个字节,以一个\0结尾,常用于txt文本文件
Unicode字符串,每个字符(汉字、英文字母)都占2个字节,以2个连续的\0结尾,NT操作系统内核用的是这种字符串,常被定义为typedef unsigned short wchar_t;所以我们有时常会见到什么char*无法转换为unsigned short*之类的错误,其实就是unicode
UTF8是Unicode一种压缩形式,英文A在unicode中表示为0x0041,老外觉得这种存储方式太浪费,因为浪费了50%的空间,于是就把英文压缩成1个字节,成了utf8编码,但是汉字在utf8中占3个字节,显然用做中文不如ansi合算,这就是中国的网页用作ansi编码而老外的网页常用utf8的原因。
utf-8在网络之间传输时可以节约数据量。
按照utf-8创始人的愿望:
端(unicode)——传输(utf-8)——端(unicode)
在中文和日文操作系统里生成的(txt和xml)文件的编码虽然都是ansi,但是,在简体中文系统下,ansi 编码代表 GB2312 编码,在日文操作系统下,ansi 编码代表 JIS 编码。不同 ansi 编码之间互不兼容,当信息在国际间交流时,无法将属于两种语言的文字,存储在同一段 ansi 编码的文本中。
结论:国际文档(txt和xml)使用unicode编码是正宗做法,因为UNICODE可以让所有语言共存;操作系统和浏览器都能够“理解”unicode编码。
关于字符编码