关于Java的代码点(codePoint)、unicode编码、UTF-8

something before start

看Character和String的时候发现的小知识点,挺好玩的

unicode

ASCII 码一共定义了 128 个字符,英语用 128 个字符来编码完全是足够的,但是用来表示其他语言,128 个字符是远远不够的。

Unicode是展示世界上所有语言中的所有字符的标准方案,他给所有的字符指定了一个数字用来表示该字符。但是Unicode并没有规定字符对应的二进制怎么存储。

因为字符很多嘛,所以就会有的字符需要两个字节,甚至三四个字节才能表示,如果直接全用四个字节表示那就太浪费空间。于是,为了较好的解决 Unicode 的编码问题, UTF-8 出现了。

UTF-8

UTF-8 是可变长编码。它可以使用 1 - 4 个字节表示一个字符,根据字符的不同变换长度。

编码规则如下:

对于单个字节的字符,第一位设为 0,后面的 7 位对应这个字符的 Unicode 码点。因此,对于英文中的 0 - 127 号字符,与 ASCII 码完全相同。

对于需要使用 N 个字节来表示的字符(N > 1),第一个字节的前 N 位都设为 1,第 N + 1 位设为0,剩余的 N - 1 个字节的前两位都设位 10,剩下的二进制位则使用这个字符的 Unicode 码点来填充。

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

codePoint

unicode的范围从000000 - 10FFFF,char的范围只能是在\u0000到\uffff。所以有的字符就需要两个char来表示,比如

上一篇:【Mysql-字符集】软件开发没看上去那么简单,从utf8mb4_0900_ai_ci说起


下一篇:解决 Python2 报错 LookupError: unknown encoding: cp65001