---對unicode編碼和java代碼單元問題研究總結
前言:最近在《java編程思想》一書中看到了代碼點與代碼單元的概念,當中介紹了java採用UTF-16編碼。一個代碼單元(code unit)大小爲兩字節16bit,可是部分字符須要用兩個代碼單元表示,因此對java中可表示字符集統稱爲代碼點(code point)。當時的認識是中文字符要用兩個代碼單元表示,其它字符用一個代碼單元表示。直到在segmentFault上看到一個問答,才發現本身的理解是錯的,所以抽出對unicode作了一個全面的瞭解。java
本文主要想解釋一下幾個問題:算法
一、什麼是unicode,它和一般所說的UTF是什麼關係 二、字符平面(plan)是什麼 三、如何用兩個代碼單元表示一個非基本字符
unicode是一種編碼標準,它是爲解決早起ISO編碼不兼容問題而提出的。它不只包括瞭如何表示一個字符,還有對字符屬性特徵的定義。【圖】在尚未unicode編碼的時候,每一個國家都有本身的一套編碼標準,這樣就會發如今兩個用不一樣編碼標準實現的計算機之間傳輸數據幾乎是不可能的事情,當時也沒有兼容多種語言的計算機。爲了你們交流方便,因而各類標準委員會就成立了,制定出了可以兼容全部字符的編碼標準--unicode。起初這個委員沒有認識到我國博大精深的語言文化,認爲用16bit(2^16=65536)已經足以表示世界上的任何一個字符。但當他們看到中國漢語字典的時候爲時已晚。因而不得不拓展編碼位數,來兼容這些語言。固然如今流通的主流字符仍是用一個代碼單元16bit來編碼的。編程
因此unicode是一種編碼標準,目標將世界上的每個字符用統一二進制數字來表示。
那麼utf又是什麼?Unicode編碼體系分爲兩部分:編碼方式和實現方式。編碼方式描述了字符和數字的對應關係,對應的是一個通用的編碼集合(UCS)。例如它用16bit編碼構成了基本字符平面,即咱們經常使用的一些字符集合。而後用21bit編碼構成了16個輔助字符平面。這種對字符的定義就是編碼方式。
UTF是編碼的實現方式,統一字符集(UCS)就是一張編好的大表,至於如何去實現它,就是UTF統一轉換格式的責任。統一字符集就像一個一個的字母,字母要轉換成能夠交流的語言。因而有了各類各樣的語言,UTF-8,UTF-16,等等,有的轉換格式省空間,有的轉換格式容易實現等等。具體用哪種實現方式徹底取決於我的的愛好,但只有兩臺計算機和軟件採用同一種編碼方式,所獲得的結果纔會是相同的。就像有些日本字看起來像漢字卻有着不一樣的意義。segmentfault
因此UTF是對統一字符集的編碼實現方式。
字符平面不用過多詳細的解釋,委員會對不一樣的編碼範圍進行了劃分,例如0號平面對應的編碼範圍是:U+0000~U+FFFF,這又稱爲基本字符平面簡稱(BMP)是用一個代碼單元編碼的,也是咱們平時最多見的字符集。另外對於超過16bit編碼的字符,委員會定義了16個輔助字符平面。每個平面都有字符範圍的定義。具體能夠參考:https://weiji.ga/zh-hans/Unic...瀏覽器
首先看一個比較奇怪的漢子:「?」 它的unicode編碼爲 U+23515 它的UTF-16表示爲:\ud84d\udd15。這是如何轉換的呢?
再考慮一個問題:「\u642d\u5676\u662f\u6253\u53d1\u65af\u8482\u82ac」這是網絡上的一串通過utf-16編碼的字符串。其中有用一個代碼單元編碼的,有用兩個代碼單元編碼的。瀏覽器或者咱們的文本編輯器如何區分呢?網絡
首先,先說明第二個問題。unicode編碼期間有一段區間碼是保留的,保留的範圍是0xD800~0xDc00 ,這段字符碼不表示任何字符。瀏覽器或編輯器從左向右解析字符串,若是編碼在這個範圍以外,則證實屬於基本字符平面的字符,之用一個代碼單元表示,在這個範圍以內的,則是須要用兩個代碼單元表示的字符。
轉化算法: 一塊兒來作個計算題編輯器
咱們要轉換漢字「?」格式的編碼爲U+23515,最後結果應該爲\ud84d\udd15編碼
v=0x23515 v'=0x23515-0x10000 = 0x13515 = 0001 0011 0101 0001 0101 vh = 0001001101 // 高十位 vl = 0100010101 // 低十位 w1=0xD800 = 1101 1000 0000 0000 w2=0xDc00 = 1101 1100 0000 0000//保留數字範圍 w1'= w1|vh = 1101 1000 0100 1101 = 0xd84d w2'= w2|vl = 1101 1101 0001 0101 = 0xdd15
至此個人疑惑解決了,固然還有不少問題,但願能和你們一塊兒討論~3d
參考連接:
維基百科 https://zh.wikipedia.org/wiki...
wiki字符平面:https://weiji.ga/zh-hans/Unic...
計算方法 http://tieba.baidu.com/p/3677...
segment提問帖: https://segmentfault.com/q/10...
《java核心技術》char字符類型一節code