BOM(byte-order mark)字节序标记,BOM的作用有两个,一是标记文本的编码类型,二是标记文本编码的字节序,文本文件的最开头都会有BOM标记(windows默认编码是ANSI,不带BOM)。
以下是各种编码相关的BOM:
UTF-8(3Byte):
EF BB BF
UTF-16(BE)(2Byte):
FE FF
UTF-16(LE)(2Byte):
FF FE
UTF-32(BE)(4Byte):
00 00 FE FF
UTF-32(LE)(4Byte):
FF FE 00 00
utf8编码是一种变长的编码方式,英文半角字符采用和ascii一致的编码方式,中文编码长度一般为3个字节,按unicode6.0编码标准,utf8最大长度为4字节。
具体的编码方式如下(来自unicode6.0标准文档):
Scalar Value | First Byte | Second Byte | Third Byte | Fourth Byte |
00000000 0xxxxxxx | 0xxxxxxx |
|
|
|
00000yyy yyxxxxxx | 110yyyyy | 10xxxxxx |
|
|
zzzzyyyy yyxxxxxx | 1110zzzz | 10yyyyyy | 10xxxxxx |
|
000uuuuu zzzzyyyy yyxxxxxx | 11110uuu | 10uuzzzz | 10yyyyyy | 10xxxxxx |
utf16和utf32都是定长的编码方式,utf16所有字符长度都为2个字节,utf32的所有字符长度都为4个字节。
BE(Big Endian)和LE(Little Endian)的区别是字节序的不同,例如:
UTF16中字符A的U码为/u0041,BE的字节序列为:/x00/x41,LE的字节序列为:/x41/x00。
顺便提一下:内存中的字节序是和具体的硬件有关系。
各种编码对应的ascii码:
ascii: {
0~9: 0x30~0x39,
a~z: 0x61~0x7a,
A~Z: 0x41~0x5a,
!(0x21)~~(0x7e): 0x21~0x7e
};
utf8(半角)和ascii一致;
utf8(全角): {
0~9: /xef/xbc/x90~/xef/xbc/x99,
a~z: /xef/xbd/x81~/xef/xbd/x9a,
A~Z: /xef/xbc/xa1~/xef/xbc/xba,
!(0x21)~_(0x5f): /xef/xbc/x81~/xef/xbc/xbf,
`(0x60)~~(0x7e): /xef/xbd/x80~/xef/xbd/x9e
};
utf16(半角): {
0~9: /u0030~/u0039,
a~z: /u0061~/u007a,
A~Z: /u0041~/u005a,
!(0x21)~~(0x7e): /u0021~/u007e
};
utf16(全角): {
0~9: /uff10~/uff19,
a~z: /uff41~/uff5a,
A~Z: /uff21~/uff3a,
!(0x21)~~(0x7e): /uff01~/uff5e
};