public static void main(String[] args) throws ExecutionException, InterruptedException, TimeoutException { char c = 0x61; System.out.println(c); String x = "u6c34u6c34"; //16**4 char y = 'u6c34'; System.out.println(x); System.out.println(y); }
Unicode字符集和UTF-8编码方式
Unicode符号范围 | UTF-8编码方式 (十六进制) | (二进制) #Unicode部分为16进制编码, UTF-8编码为2进制 —————————————————————–————————————– 0000-0000 007F | 0xxxxxxx #UTF-8规定,若1字符=1字节,首位须为‘0’ 0080-0000 07FF | 110xxxxx 10xxxxxx #UTF-8规定,若1字符=2字节,高位字节前3位为‘110’,低位前2位为‘10’ 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx #UTF-8规定,若1字符=3字节,高位字节前3位为‘110’,后面低位前2位一律为‘10’。(占4,5字节字符规则以此类推) 作者:于洋 链接:https://www.zhihu.com/question/23374078/answer/69732605 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
参考:https://www.cnblogs.com/deepblue775737449/p/7604738.html
https://www.zhihu.com/question/23374078/answer/69732605 :写的非常好
有趣的GBK和UTF8起源:在文本中输入“联通”二字,再次打开会乱码,原因所在
当你在windows的记事本里新建一个文件,输入“联通”两个字之后,保存,关闭,然后再次打开,你会发现这两个字已经消失了,代之的是几个乱码!呵呵,有人说这就是联通之所以拼不过移动的原因。
其实这是因为GB2312编码与UTF8编码产生了编码冲撞的原因。
从网上引来一段从UNICODE到UTF8的转换规则:
|-------------|-----------------------------|
|Unicode | UTF-8 |
|-------------|-----------------------------|
|0000 – 007F| 0xxxxxxx |
|0080 - 07FF| 110xxxxx 10xxxxxx |
|0800 – FFFF| 1110xxxx 10xxxxxx 10xxxxxx |
|-------------|-----------------------------|
例如“汉”字的Unicode编码是6C49。6C49在0800-FFFF之间,所以肯定要用3字节模板了:1110xxxx 10xxxxxx 10xxxxxx。将6C49写成二进制是:0110 1100 0100 1001,将这个比特流按三字节模板的分段方法分为0110 110001 001001,依次代替模板中的x,得到:1110-0110 10-110001 10-001001,即E6 B1 89,这就是其UTF8的编码。
而当你新建一个文本文件时,记事本的编码默认是ANSI, 如果你在ANSI的编码输入汉字,那么他实际就是GB系列的编码方式,在这种编码下,“联想”的内码是:
c1 1100 0001
aa 1010 1010
cd 1100 1101
a8 1010 1000
注意到了吗?第一二个字节、第三四个字节的起始部分的都是“110”和“10”,正好与UTF8规则里的两字节模板是一致的,于是再次打开记事本时,记事本就误认为这是一个UTF8编码的文件,让我们把第一个字节的110和第二个字节的10去掉,我们就得到了“00001 101010”,再把各位对对齐,补上前导的0,就得到了“0000 0000 0110 1010”,不好意思,这是UNICODE的006A,也就是小写的字母“j”,而之后的两字节用UTF8解码之后是0368,这个字符什么也不是。这就是只有“联通”两个字的文件没有办法在记事本里正常显示的原因。
而如果你在“联通”之后多输入几个字,其他的字的编码不见得又恰好是110和10开始的字节,这样再次打开时,记事本就不会坚持这是一个utf8编码的文件,而会用ANSI的方式解读之,这时乱码又不出现了。
好了,终于可以回答NICO的问题了,在数据库里,有n前缀的字串类型就是UNICODE类型,这种类型中,固定用两个字节来表示一个字符,无论这个字符是汉字还是英文字母,或是别的什么。
如果你要测试“abc汉字”这个串的长度,在没有n前缀的数据类型里,这个字串是7个字符的长度,因为一个汉字相当于两个字符。而在有n前缀的数据类型里,同样的测试串长度的函数将会告诉你是5个字符,因为一个汉字就是一个字符。
参考:https://blog.csdn.net/qq_36688143/article/details/79496753