character-encoding
字符包含书写出的字母、汉字、数字、标点符号、表情。char 和 String 都可表示字符
键盘输入到页面展示的顺序:字符 - 码点 - 字体
码点和字符:编码表<int 码点(字符的唯一标识), 字符的二进制存储和传输格式>
- Unicode定义每个字符的唯一码点(标识)
- 字符编码方案UTF-8、UTF-16 将 码点 映射成 字符的二进制存储和传输格式。 UTF-8指明至少需要 8位=1字节 来标识一个字符
映射规则:
| 码点范围 | 二进制标量值 | Byte1 | Byte2 | Byte3 | Byte4 |
|---|---|---|---|---|---|
| U+0000..U+007F | 00000 00000 0000x xxxxxx | 0xxxxxxx | |||
| U+0080..U+07FF | 00000 00000 yyyyy xxxxxx | 110yyyyy | 10xxxxxx | ||
| U+0800..U+D7FF,U+E000..U+FFFF | 00000 zzzzy yyyyy xxxxxx | 1110zzzz | 10yyyyyy | 10xxxxxx | |
| U+10000..U+10FFFF | uuuzz zzzzy yyyyy xxxxxx | 11110uuu | 10zzzzzz | 10yyyyyy | 10xxxxxx |
映射结果:
| 字符 | Unicode码点(十六进制) | Unicode码点(二进制) | UTF-8 |
|---|---|---|---|
| 啊 | U+554A | 00000 01010101 01001010 | 11100101 10010101 10001010 |
UTF-8,用标识位和数据位来表示字节,编码逻辑:
- 字节最高位,0-单字节表示字符,1-多字节表示字符;
- 首(开始)字节最高位是11;后续字节最高位是10;
- 首字节有N个1,表示用N个字节表示字符;1110XXX 表示用3个字节表示一个字符
Ref:编码胡同:字符编码