摘要:起初這個委員沒有認識到我國博大精深的語言文化,認為用已經足以表示世界上的任何一個字符。所以是一種編碼標準,目標將世界上的每一個字符用統一二進制數字來表示。編碼期間有一段區間碼是保留的,保留的范圍是這段字符碼不表示任何字符。
---對unicode編碼和java代碼單元問題研究總結
前言:最近在《java編程思想》一書中看到了代碼點與代碼單元的概念,當中介紹了java采用UTF-16編碼。一個代碼單元(code unit)大小為兩字節16bit,但是部分字符需要用兩個代碼單元表示,所以對java中可表示字符集統稱為代碼點(code point)。當時的認識是中文字符要用兩個代碼單元表示,其它字符用一個代碼單元表示。直到在segmentFault上看到一個問答,才發現自己的理解是錯的,因此抽出對unicode做了一個全面的了解。
本文主要想解釋一下幾個問題:
1、什么是unicode,它和通常所說的UTF是什么關系 2、字符平面(plan)是什么 3、如何用兩個代碼單元表示一個非基本字符unicode
unicode是一種編碼標準,它是為解決早起ISO編碼不兼容問題而提出的。它不僅包括了如何表示一個字符,還有對字符屬性特征的定義。【圖】在還沒有unicode編碼的時候,每個國家都有自己的一套編碼標準,這樣就會發現在兩個用不同編碼標準實現的計算機之間傳輸數據幾乎是不可能的事情,當時也沒有兼容多種語言的計算機。為了大家交流方便,于是各種標準委員會就成立了,制定出了能夠兼容所有字符的編碼標準--unicode。起初這個委員沒有認識到我國博大精深的語言文化,認為用16bit(2^16=65536)已經足以表示世界上的任何一個字符。但當他們看到中國漢語字典的時候為時已晚。于是不得不拓展編碼位數,來兼容這些語言。當然現在流通的主流字符還是用一個代碼單元16bit來編碼的。
所以unicode是一種編碼標準,目標將世界上的每一個字符用統一二進制數字來表示。UTF(Unicode Transformation Format)
那么utf又是什么?Unicode編碼體系分為兩部分:編碼方式和實現方式。編碼方式描述了字符和數字的對應關系,對應的是一個通用的編碼集合(UCS)。例如它用16bit編碼構成了基本字符平面,即我們常用的一些字符集合。然后用21bit編碼構成了16個輔助字符平面。這種對字符的定義就是編碼方式。
UTF是編碼的實現方式,統一字符集(UCS)就是一張編好的大表,至于如何去實現它,就是UTF統一轉換格式的責任。統一字符集就像一個一個的字母,字母要轉換成可以交流的語言。于是有了各種各樣的語言,UTF-8,UTF-16,等等,有的轉換格式省空間,有的轉換格式容易實現等等。具體用哪一種實現方式完全取決于個人的愛好,但只有兩臺計算機和軟件采用同一種編碼方式,所得到的結果才會是相同的。就像有些日本字看起來像漢字卻有著不同的意義。
所以UTF是對統一字符集的編碼實現方式。字符平面
字符平面不用過多詳細的解釋,委員會對不同的編碼范圍進行了劃分,例如0號平面對應的編碼范圍是:U+0000~U+FFFF,這又稱為基本字符平面簡稱(BMP)是用一個代碼單元編碼的,也是我們平時最常見的字符集。另外對于超過16bit編碼的字符,委員會定義了16個輔助字符平面。每一個平面都有字符范圍的定義。具體可以參考:https://weiji.ga/zh-hans/Unic...
最后詳細講將一下UTF-16實現首先看一個比較奇怪的漢子:“?” 它的unicode編碼為 U+23515 它的UTF-16表示為:ud84dudd15。這是如何轉換的呢?
再考慮一個問題:“u642du5676u662fu6253u53d1u65afu8482u82ac”這是網絡上的一串經過utf-16編碼的字符串。其中有用一個代碼單元編碼的,有用兩個代碼單元編碼的。瀏覽器或者我們的文本編輯器如何區分呢?
首先,先說明第二個問題。unicode編碼期間有一段區間碼是保留的,保留的范圍是0xD800~0xDc00 ,這段字符碼不表示任何字符。瀏覽器或編輯器從左向右解析字符串,如果編碼在這個范圍之外,則證明屬于基本字符平面的字符,之用一個代碼單元表示,在這個范圍之內的,則是需要用兩個代碼單元表示的字符。
轉化算法: 一起來做個計算題
我們要轉換漢字“?”格式的編碼為U+23515,最后結果應該為ud84dudd15
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
至此我的疑惑解決了,當然還有很多問題,希望能和大家一起討論~
參考鏈接:
維基百科 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字符類型一節
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/69831.html
摘要:在一個閉包環境內修改變量值,不會影響另一個閉包中的變量。直到看到函數閉包閉包這篇文章的代碼一部分,終于明白其中的邏輯了。 閉包 閉包定義:指擁有多個變量和綁定了這些變量的環境的表達式(通常是一個函數),因而這些變量也是該表達式的一部分。函數內部可以直接讀取全局變量。函數內部變量無法在函數外部訪問。函數內部聲明要用var或者let聲明,不然會變成全局變量鏈式作用域:子對象會一級級向上尋找...
摘要:對傳給的進行操作。之所以被稱為是因為被繼承了,而不是繼承了。在這種方式中,它們的關系看上去被反轉了。在原則,這叫單一職責原則。組合的方式是可以保證組件具有充分的復用性,靈活度,遵守原則的其中一種實踐。 前言 最近在學習React的封裝,雖然日常的開發中也有用到HOC或者Render Props,但從繼承到組合,靜態構建到動態渲染,都是似懂非懂,索性花時間系統性的整理,如有錯誤,請輕噴~...
摘要:全面移動可能是非常艱巨的,但云允許有選擇的移動。云可用于容災削減人員成本。說起云計算,真是最熟悉的陌生人,天天看到它的相關新聞,卻對它似懂非懂,小編日前在網上看到一組調查數據,有90%以上的讀者不知道云計算為何物,不知道云計算的概念,知道云計算能用來干什么就行了。云計算其實就像家里電器一樣。為了能夠使用這些電器,我們家里有沒有必要自備一個發電機吧?顯然不需要。只需要把插頭插上,就可以使用電器...
摘要:作為一個前端開發,大多數面對的都是學不好,不知道如何學,或者說容易半途而廢,這也是說我自己。這天定位于了解能夠簡單讀懂或者使用的人,如果沒有請參照以下網址,學習基礎知識。如有錯誤或者建議歡迎斧正。 作為一個前端開發,大多數面對的都是學不好JavaScript,不知道如何學,或者說容易半途而廢,這也是說我自己。一年以來接觸的JS都是零零散散的,懂或似懂非懂,花點時間好好鞏固下,有興趣的跟...
摘要:常用模式片段之摘要第一次看到這個字眼是在中,即。之后也見到一些別人的代碼里有,它和頁面的有什么關系,以及和有何淵源。以前都見過這些詞,但都似懂非懂,今天查了些資料收集了些代碼,做個完整的理解。 CSS篇 常用模式片段之CSS布局篇 http://jsorz.cn/blog/2016/08/code-patterns-of-css-layout.html 摘要:position 拉伸性質...
閱讀 2254·2021-09-26 09:55
閱讀 3584·2021-09-23 11:22
閱讀 2151·2019-08-30 15:54
閱讀 1894·2019-08-28 18:03
閱讀 2593·2019-08-26 12:22
閱讀 3426·2019-08-26 12:20
閱讀 1723·2019-08-26 11:56
閱讀 2245·2019-08-23 15:30