UTF-8
- UTF-8 是 Unicode标准中的一种 , 还有 UTF-16 , UTF-32
- UTF-8 的长度可变, 例如字母站一字节,汉字占三字节
- UTF-8 分为带BOM开头的 , 和不带BOM开头的, 两种
BOM占用开头三字节, 分别是 : 0xef , 0xbb , 0xbf - UTF-8 不需要BOM就能识别, 它有明显的特点
UTF-8 编码的特点, 可以用来识别文件格式是否为 UTF-8
百度百科说UTF-8最大支持4字节,
- 一个US-ASCIl字符只需1字节编码(Unicode范围由U+0000~U+007F)。
- 带有变音符号的拉丁文、希腊文、西里尔字母、亚美尼亚语、希伯来文、阿拉伯文、叙利亚文等字母则需要2字节编码(Unicode范围由U+0080~U+07FF)。
- 其他语言的字符(包括中日韩文字、东南亚文字、中东文字等)包含了大部分常用字,使用3字节编码。
- 其他极少使用的语言字符使用4字节编码。
但看其特点, 支持6字节也是可以的
- 一字节 0xxxxxxx
- 二字节 110xxxxx 10xxxxxx
- 三字节 1110xxxx 10xxxxxx 10xxxxxx
- 四字节 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
- 五字节 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
- 六字节 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
一字节时和ascii , iso8859-1 , gbk 是一样的, 不能用来判断
二字节开始的规律
一个字节二进制有几个1开头, 后面就有几减一个10开头的字节
五字节和六字节不是Unicode编码范围, 2003年RFC3629规定Utf-8只能使用原Unicode规定的区域(小于等于四字节)
JAVA 的 UTF-8 相关
Java 的 sun.nio.cs.UTF_8 类中有一段注释 , 也可以参考
/* Legal UTF-8 Byte Sequences
*
* # Code Points Bits Bit/Byte pattern
* 1 7 0xxxxxxx
* U+0000..U+007F 00..7F
*
* 2 11 110xxxxx 10xxxxxx
* U+0080..U+07FF C2..DF 80..BF
*
* 3 16 1110xxxx 10xxxxxx 10xxxxxx
* U+0800..U+0FFF E0 A0..BF 80..BF
* U+1000..U+FFFF E1..EF 80..BF 80..BF
*
* 4 21 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
* U+10000..U+3FFFF F0 90..BF 80..BF 80..BF
* U+40000..U+FFFFF F1..F3 80..BF 80..BF 80..BF
* U+100000..U10FFFF F4 80..8F 80..BF 80..BF
*
*/
public final class UTF_8 extends Unicode {