1. 程式人生 > >介紹Unicode的編碼方式和實現方式

介紹Unicode的編碼方式和實現方式

        Unicode 是基於通用字符集(Universal Character Set)的標準來發展,6.1版已釋出(2012年1月31日)。Unicode定義了大到足以代表人類所有可讀字元的字符集。

  大概來說,Unicode 編碼系統可分為編碼方式和實現方式兩個層次。

編碼方式
  Unicode是國際組織制定的可以容納世界上所有文字和符號的字元編碼方案。Unicode用數字0-0x10FFFF來對映這些字元,最多可以容納1114112個字元,或者說有1114112個碼位。碼位就是可以分配給字元的數字。UTF-8、UTF-16、UTF-32都是將數字轉換到程式資料的編碼方案。
  通用字符集(Universal Character Set,UCS)是由ISO制定的ISO 10646(或稱ISO/IEC 10646)標準所定義的標準字符集。UCS-2用兩個位元組編碼,UCS-4用4個位元組編碼。

  UCS-4根據最高位為0的最高位元組分成2^7=128個group。每個group再根據次高位元組分為256個平面(plane)。每個平面根據第3個位元組分為256行 (row),每行有256個碼位(cell)。group 0的平面0被稱作BMP(Basic Multilingual Plane)。將UCS-4的BMP去掉前面的兩個零位元組就得到了UCS-2。每個平面有2^16=65536個碼位。Unicode計劃使用了17個平面,一共有17*65536=1114112個碼位。在Unicode 5.0.0版本中,已定義的碼位只有238605個,分佈在平面0、平面1、平面2、平面14、平面15、平面16。其中平面15和平面16上只是定義了兩個各佔65534個碼位的專用區(Private Use Area),分別是0xF0000-0xFFFFD和0x100000-0x10FFFD。所謂專用區,就是保留給大家放自定義字元的區域,可以簡寫為PUA。

實現方式

  在Unicode中:漢字“字”對應的數字是23383。在Unicode中,我們有很多方式將數字23383表示成程式中的資料,包括:UTF-8、UTF-16、UTF-32。UTF是“UCS Transformation Format”的縮寫,可以翻譯成Unicode字符集轉換格式,即怎樣將Unicode定義的數字轉換成程式資料。例如,“漢字”對應的數字是0x6c49和0x5b57,而編碼的程式資料是:
  BYTE data_utf8[] = {0xE6, 0xB1, 0x89, 0xE5, 0xAD, 0x97}; // UTF-8編碼
  WORD data_utf16[] = {0x6c49, 0x5b57}; // UTF-16編碼
  DWORD data_utf32[] = {0x6c49, 0x5b57}; // UTF-32編碼
  這裡用BYTE、WORD、DWORD分別表示無符號8位整數,無符號16位整數和無符號32位整數。UTF-8、UTF-16、UTF-32分別以BYTE、WORD、DWORD作為編碼單位。“漢字”的UTF-8編碼需要6個位元組。“漢字”的UTF-16編碼需要兩個WORD,大小是4個位元組。“漢字”的UTF-32編碼需要兩個DWORD,大小是8個位元組。根據位元組序的不同,UTF-16可以被實現為UTF-16LE或UTF-16BE,UTF-32可以被實現為UTF-32LE或UTF-32BE。下面介紹UTF-8、UTF-16、UTF-32、位元組序和BOM。
  UTF-8
  UTF-8以位元組為單位對Unicode進行編碼。從Unicode到UTF-8的編碼方式如下:
  Unicode編碼(16進位制) ║ UTF-8 位元組流(二進位制)
  000000 - 00007F ║ 0xxxxxxx
  000080 - 0007FF ║ 110xxxxx 10xxxxxx
  000800 - 00FFFF ║ 1110xxxx 10xxxxxx 10xxxxxx
  010000 - 10FFFF ║ 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
  UTF-8的特點是對不同範圍的字元使用不同長度的編碼。對於0x00-0x7F之間的字元,UTF-8編碼與ASCII編碼完全相同。UTF-8編碼的最大長度是4個位元組。從上表可以看出,4位元組模板有21個x,即可以容納21位二進位制數字。Unicode的最大碼位0x10FFFF也只有21位。
  例1:“漢”字的Unicode編碼是0x6C49。0x6C49在0x0800-0xFFFF之間,使用用3位元組模板了:1110xxxx 10xxxxxx 10xxxxxx。將0x6C49寫成二進位制是:0110 1100 0100 1001, 用這個位元流依次代替模板中的x,得到:11100110 10110001 10001001,即E6 B1 89。
  例2:Unicode編碼0x20C30在0x010000-0x10FFFF之間,使用用4位元組模板了:11110xxx 10xxxxxx 10xxxxxx 10xxxxxx。將0x20C30寫成21位二進位制數字(不足21位就在前面補0):0 0010 0000 1100 0011 0000,用這個位元流依次代替模板中的x,得到:11110000 10100000 10110000 10110000,即F0 A0 B0 B0。


相關推薦

介紹Unicode編碼方式實現方式

        Unicode 是基於通用字符集(Universal Character Set)的標準來發展,6.1版已釋出(2012年1月31日)。Unicode定義了大到足以代表人類所有可讀字元的字符集。  大概來說,Unicode 編碼系統可分為編碼方式和實現方式兩

虛擬化的發展歷程實現方式

同時 方法 發展歷程 note 沒有 avi cati 當我 訪問 前言 現在市場上最常見的虛擬化軟件有VMWare workstation(VMWare)、VirtualBox(Oracle)、Hyper-V(Microsoft)、KVM(Redhat)、Xen等,這些軟

(筆記)Linux內核學習(七)之內核同步機制實現方式

mem head ron int 可用 ati 自旋 占用 void 一 原子操作 指令以原子的方式執行——執行過程不被打斷。 1 原子整數操作 原子操作函數接收的操作數類型——atomic_t //定義 atomic_t v;//初始化

CSS 0.5px 細線邊框的原理實現方式

bottom back 先決條件 device min style ati 而且 origin   細線邊框的具體實現方法有:偽元素縮放或漸變,box-shadow模擬,svg畫線,border-image裁剪等。要實現小於1px的線條,有個先決條件:屏幕的分辨率要足夠高,

Java: 淺拷貝深拷貝的理解實現方式

Java中的物件拷貝(Object Copy)指的是將一個物件的所有屬性(成員變數)拷貝到另一個有著相同類型別的物件中去。舉例說明:比如,物件A和物件B都屬於類S,具有屬性a和b。那麼對物件A進行拷貝操作賦值給物件B就是:B.a=A.a;  B.b=A.b; 在程式中拷貝物件是很常見的

python遞迴方式普通方式實現輸出查詢斐波那契數列

●斐波那契數列 斐波那契數列(Fibonacci sequence),是從1,1開始,後面每一項等於前面兩項之和。 如果為了方便可以用遞迴實現,要是為了效能更好就用迴圈。 ◆遞迴方式實現生成前30個斐波那契數 list = [] for i in range(30): if i == 0

Java多執行緒之—Synchronized方式CAS方式實現執行緒安全效能對比

效能比較猜想 1.大膽假設 在設計試驗方法之前,針對Synchronized和CAS兩種方式的特點,我們先來思考一下兩種方式效率如何? 首先,我們在回顧一下兩種方式是如何保證執行緒安全的。Synchronized方式通過大家應該很熟悉,他的行為非常悲觀,只要有一個執行緒進

hbase的rowkey設計原則實現方式

一:hbase的儲存形式 hbase的內部使用KeyValue的形式存在,其key是有rowkey:family:column:logTime,value是其儲存的內容。 其在region的是大多以升序的形式排列,唯一的是logtime是以降序的形式進行排列。 所以,按照越靠近左邊的資訊越容易被檢索到。

Java 淺拷貝深拷貝的理解實現方式

Java中的物件拷貝(Object Copy)指的是將一個物件的所有屬性(成員變數)拷貝到另一個有著相同類型別的物件中去。舉例說明:比如,物件A和物件B都屬於類S,具有屬性a和b。那麼對物件A進行拷貝操作賦值給物件B就是:B.a=A.a;  B.b=A.b; 在程式中拷貝物件是很常見的

串列埠uart中斷方式查詢方式的選擇以及高效實現(迴圈FIFO)

串列埠uart中斷方式和查詢方式的選擇以及高效實現 1. 中斷方式和查詢方式的選擇 (1) 串列埠中斷方式相比查詢方式效率要高。 串列埠傳輸速率比較慢。比如對於系統時鐘為100MHz的MCU,串列埠波特率為115200。傳輸一個位元組大概需要10000個時鐘週期,所以系統大部分的時間

JNI的架構實現方式

在android中提供JNI的方式,讓Java程式可以呼叫C語言程式。Android中很多Java類都具有native介面,這些native介面就是由本地實現,然後註冊到系統中去的。 在Android中,主要的JNI程式碼在這裡: frameworks/base/core/

View State的作用實現方式

簡答:View State是微軟實現的快取機制。有點類似以前的表單中的隱藏控制元件。當 asp.net 執行某個頁面時,該頁面上的 viewstate 值和所有控制元件將被收集並格式化成一個編碼字串,然後被分配給隱藏窗體欄位的值屬性(即 <input type=hidden>)。由於隱藏窗體欄位是

淺析新大陸條碼掃描模組在現代企業流水的作用實現方式

很多 -a 淺析 str img 實現 技術 ali 一個 現代化企業的迅速發展,為了提高生產效率與節約成本,在生產線上輔有條碼的生產標簽逐漸成為企業快速分揀的一個法寶。很多企業開始向智能化工廠轉型,而通過使用新大陸模組的工業固定式讀碼設備來解決流水線上的條碼檢測問題,同時

對API進行版本控制的重要性實現方式

我在API設計中收到的最常見問題之一就是如何對API進行版本控制。雖然並非所有API都完全相同,但我發現在API版本控制方面,某些模式和實踐適用於大多數團隊。我已經將這些內容收集起來,下面將提供一些關於版本控制策略的建議,該策略將幫助大多數API提供商,無論他們是向內部署API,還是對外的API。 API版本

實現API優先設計的重要性實現方式

應用API優先的方法意味著設計API時,使其具有一致性和適應性,無論應用於哪些開發專案。對API使用API​​描述語言(如OpenAPI)是關鍵,因為它有助於建立API與其他程式通訊的樞紐,即使這些系統各自的語言不同。當然,API不存在於單獨的真空中,因此與其利益相關者的協作和規劃對於設計過程同樣重要,設計過

Spring 框架基礎(05):事務管理機制,實現方式

本文原始碼:GitHub·點這裡 || GitEE·點這裡 一、Spring事務管理 1、基礎描述 Spring事務管理的本質就是封裝了資料庫對事務支援的操作,使用JDBC的事務管理機制,就是利用java.sql.Connection物件完成對事務的提交和回滾。 Connection conn = Drive

9.Solr4.10.3數據導入(post.jar方式curl方式)

order multicore aps start publish 所有 padding enca 頭信息 轉載請出自出處:http://www.cnblogs.com/hd3013779515/1.使用post.jar方式 java -Durl=http://192.16

XML文件解析-DOM4J方式SAX方式

public bsp input main saxparser exception element rac default 最近遇到的工作內容都是和xml內容解析相關的. 1圖片數據以base64編碼的方式保存在xml的一個標簽中,xml文件通過接口的方式發送給我,然後我去

使用pull方式sax方式對xml文件進行解析

tostring 需要 nts tag .com version thp response pri 這是我自己設置的xml文件 用一下方式獲取它的內容 try{ OkHttpClient client = new OkHttpClient(); Request

springboot整合mybatis(映射文件方式註解方式

分頁 character 訪問 runt mod tis 1.2 req arch   springboot作為一個微服務框架,給我們開發人員提供極大的便利,秉著約定大於配置的原則,通過starter包的形式為我們做了許多默認的配置,在進行數據持久化到關系型數據庫時,我們一