unicode家族
定义
如果把各种文字编码形容为各地的方言,那么Unicode就是世界各国合作开发的一种语言。
Unicode 只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储。
UTF-8、UTF-16、UTF-32是将Unicode定义的数字转换成程序数据,进行存储。
别称: 万国码
编码方式
UTF-8
- 特点
是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。
- 编码规则
1)对于单字节的符号,字节的第一位设为0,后面7位为这个符号的 Unicode 码。因此对于英语字母,UTF-8 编码和 ASCII 码是相同的。
2)对于n字节的符号(n > 1),第一个字节的前n位都设为1,第n + 1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的 Unicode 码。
下表总结了编码规则,字母x表示可用编码的位。
- 案例(严)
严的 Unicode 是4E25(100111000100101),根据上表,可以发现4E25处在第三行的范围内(0000 0800 - 0000 FFFF),因此严的 UTF-8 编码需要三个字节,即格式是1110xxxx 10xxxxxx 10xxxxxx。然后,从严的最后一个二进制位开始,依次从后向前填入格式中的x,多出的位补0。这样就得到了,严的 UTF-8 编码是11100100 10111000 10100101,转换成十六进制就是E4B8A5。
UTF-16
一般用两个字节来表示字符,但有时也用四个字节来表示字符。不与ASCII码兼容
UTF-32
所有的字符都用四个字节来表示。不与ASCII码兼容
Little endian 和 Big endian
UCS-2 格式可以存储 Unicode 码(码点不超过0xFFFF)。以汉字严为例,Unicode 码是4E25,需要用两个字节存储,一个字节是4E,另一个字节是25。存储的时候,4E在前,25在后,这就是 Big endian 方式;25在前,4E在后,这是 Little endian 方式。
第一个字节在前,就是"大头方式"(Big endian),第二个字节在前就是"小头方式"(Little endian)。
那么很自然的,就会出现一个问题:计算机怎么知道某一个文件到底采用哪一种方式编码?
Unicode 规范定义,每一个文件的最前面分别加入一个表示编码顺序的字符,这个字符的名字叫做"零宽度非换行空格"(zero width no-break space),用FEFF表示。这正好是两个字节,而且FF比FE大1。
如果一个文本文件的头两个字节是FE FF,就表示该文件采用大头方式;如果头两个字节是FF FE,就表示该文件采用小头方式。
JAVA中把Unicode转中文
- 案例:
- JAVA 代码
public static String unicodeToString(String str) {
Pattern pattern = Pattern.compile("(\\\\u(\\p{XDigit}{4}))");
Matcher matcher = pattern.matcher(str);
char ch;
while (matcher.find()) {
//group 6728
String group = matcher.group(2);
//ch:'木' 26408
ch = (char) Integer.parseInt(group, 16);
//group1 \u6728
String group1 = matcher.group(1);
str = str.replace(group1, ch + "");
}
return str;
}
- 转换结果
<RES.1>2020-07-12 10:34:31</RES.1><RES.2>0</RES.2> 未查询到挂号信息或挂号信息己超过有效期!
相关文章
常用字符集编码:https://www.cnblogs.com/xiaofengshan/p/15235517.html
16进制字符串和byte数组进行相互转换:https://www.cnblogs.com/xiaofengshan/p/15224551.html
Gitee地址
参考:
http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html
https://pcedu.pconline.com.cn/empolder/gj/other/0505/616631.html
https://zhuanlan.zhihu.com/p/137875615