字符编码方式及大端小端
参考资料:
http://www.cnblogs.com/zhouyuqin/p/4688459.html
http://pcedu.pconline.com.cn/empolder/gj/other/0505/616631_1.html
常见的编码格式总结:
1、ASCII码
2、ISO-8859-1(即Latin1)
3、GB2312
4、GBK
5、GB18030
6、BIG5
BIG5是双字节编码,是繁体中文字符集编码标准,使用两个字节来表示一个字符。高位字节使用了0x81-0xFE,低位字节使用了0x40-0x7E,及0xA1-0xFE。该编码共收录13060个中文字,其中有二字为重复编码,即“兀、兀”(A461及C94A)和“嗀、嗀”(DCD1及DDFC)。点击这里,查看BIG5编码。
注意,BIG5编码 与 GBK编码、GB2312等没有什么关系,与它们不兼容。
7、UCS-2
Unicode字符集的一种编码实现,用2个字节编码。
UCS-2是定长字节的,固定使用2个字节进行编码,从0000(十六进制)- FFFF(十六进制)的码位范围,对应第一个Unicode平面。
采用BOM(Byte Order Mark)机制,该机制作用如下:1. 确定字节流采用的是大端序还是小端序(如果一个文本文件的头两个字节是FE FF,就表示该文件采用大端方式;如果头两个字节是FF FE,就表示该文件采用小端方式。)。2. 确定字节流的Unicode编码方案。
8、UCS-4
Unicode字符集的一种编码实现,用4个字节编码。
UCS-4是定长字节的,固定使用4个字节进行编码。也采用了BOM机制。
9、UTF-16
10、UTF-8
UTF-8的编码规则很简单,只有二条:
1)对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。
2)对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。
下表总结了编码规则,字母x表示可用编码的位。
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,就表示当前字符占用多少个字节。
已知"严"的unicode是4E25(100111000100101),根据上表,可以发现4E25处在第三行的范围内(0000 0800-0000 FFFF),因此"严"的UTF-8编码需要三个字节,即格式是"1110xxxx 10xxxxxx 10xxxxxx"。然后,从"严"的最后一个二进制位开始,依次从后向前填入格式中的x,多出的位补0。这样就得到了,"严"的UTF-8编码是"11100100 10111000 10100101",转换成十六进制就是E4B8A5。
11、大端小端
- ANSI是默认编码方式,对于英文文件是ASCII编码,对于简体中文文件是GB2312编码(只针对Windows简体中文版,如果是繁体中文版会采用Big5码)
- Unicode编码指的是UCS-2编码方式(微软软件的习惯),即直接用两个字节存入字符的Unicode码。这个选项用的little endian格式。
- Unicode big endian编码与上一个选项相对应。
- UTF-8编码。
另,关于大端小端:
[ 大端小端取决于CPU架构,powerpc,aix、SPARC等是大端;x86架构处理器(Intel、AMD,PC)、arm架构处理器(arm,手机)是小端 ]
采用大小模式对数据进行存放的主要区别在于在存放的字节顺序,若数字的高位在内存中的低地址则是大端(即数字在内存中的二进制形式的第一字节是数字的高位),否则是小端。
采用小端方式进行数据存放利于计算机处理,因此计算机的内部处理较多用小端字节序。比如整数的加法和乘法、数的比较、奇偶性校验等,因为从个位比起即可而此时不用全读进来;另例是C语言的大整型向小整型的强转,直接截断实现下若是用小端存储则指针不用变而大端要变。
采用大端方式进行数据存放符合人类的正常思维,除了计算机的内部处理,其他的场合几乎都是大端字节序,比如网络传输和文件储存。
到目前为止,采用大端或者小端进行数据存放,其孰优孰劣也没有定论。
那么:对于Unicode字符集的编码(UCS-2、UTF-16、UTF-32等),计算机怎么知道某一个文件到底采用哪一种方式编码?
Unicode规范中定义,每一个文件的最前面分别加入一个表示编码顺序的字符,这个字符的名字叫做"零宽度非换行空格"(ZERO WIDTH NO-BREAK SPACE),用FEFF表示。这正好是两个字节,而且FF比FE大1。
如果一个文本文件的头两个字节是FE FF,就表示该文件采用大端方式;如果头两个字节是FF FE,就表示该文件采用小端方式。
另外,UTF-8是不需要BOM的因为其没有字节序的问题,编码自身就包含了字节指示信息,但微软在 UTF-8 中使用了 BOM ,因为这样可以把 UTF-8 和 ASCII 等编码明确区分开,但这样的文件在 Windows 之外的操作系统里会带来问题。
更多见 彻底理解字符编码