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表示可用編碼的位。
image

  • 案例(嚴)

嚴的 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轉中文

  • 案例:

\r\n \r\n<RES.1>2020-07-12 10:34:31</RES.1>\r\n<RES.2>0</RES.2>\r\n<ERR Code="00000.01">\u672A\u67E5\u8BE2\u5230\u6302\u53F7\u4FE1\u606F\u6216\u6302\u53F7\u4FE1\u606F\u5DF1\u8D85\u8FC7\u6709\u6548\u671F!</ERR>\r\n</RES>\r\n</MSG>

  • 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地址

https://gitee.com/zhuayng/foundation-study/tree/develop/JavaBasis/Other/src/main/java/com/yxkj/other/modular/coding

參考:

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM