最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺談Java中Unicode的編碼和實(shí)現(xiàn)

 更新時(shí)間:2017年10月25日 16:26:08   作者:凝靜志遠(yuǎn)  
這篇文章向大家介紹了Java編程中Unicode編碼及實(shí)現(xiàn)的相關(guān)內(nèi)容,列舉了幾個(gè)字符不同表達(dá)式的比較,以及Unicode平面映射的知識,具有一點(diǎn)點(diǎn)參考價(jià)值,需要的朋友可以了解下。

Unicode的編碼和實(shí)現(xiàn)

大概來說,Unicode編碼系統(tǒng)可分為編碼方式和實(shí)現(xiàn)方式兩個(gè)層次。

編碼方式

字符是抽象的最小文本單位。它沒有固定的形狀(可能是一個(gè)字形),而且沒有值?!癆”是一個(gè)字符,“€”也是一個(gè)字符。字符集是字符的集合。編碼字符集是一個(gè)字符集,它為每一個(gè)字符分配一個(gè)唯一數(shù)字。

Unicode 最初設(shè)計(jì)是作為一種固定寬度的 16 位字符編碼。也就是每個(gè)字符占用2個(gè)字節(jié)。這樣理論上一共最多可以表示216(即65536)個(gè)字符。上述16位統(tǒng)一碼字符構(gòu)成基本多文種平面?;径辔姆N平面的字符的編碼為U+hhhh,其中每個(gè)h代表一個(gè)十六進(jìn)制數(shù)字。

很明顯,16 位編碼的所有 65,536 個(gè)字符并不能完全表示全世界所有正在使用或曾經(jīng)使用的字符。于是,Unicode 標(biāo)準(zhǔn)已擴(kuò)展到包含多達(dá) 1,112,064 個(gè)字符。那些超出原來的 16 位限制的字符被稱作增補(bǔ)字符。Unicode 標(biāo)準(zhǔn) 2.0 版是第一個(gè)包含

啟用增補(bǔ)字符設(shè)計(jì)的版本,但是,直到 3.1 版才收入第一批增補(bǔ)字符集。

Unicode字符平面映射

目前的Unicode字元分為17組編排,每組稱為平面(Plane),而每平面擁有65536(即216)個(gè)代碼點(diǎn)。然而目前只用了少數(shù)平面。

平面 始末字元值 中文名稱 英文名稱
0號平面 U+0000 - U+FFFF 基本多文種平面 Basic Multilingual Plane,簡稱BMP
1號平面 U+10000 - U+1FFFF 多文種補(bǔ)充平面 Supplementary Multilingual Plane,簡稱SMP
2號平面 U+20000 - U+2FFFF 表意文字補(bǔ)充平面 Supplementary Ideographic Plane,簡稱SIP
3號平面 U+30000 - U+3FFFF 表意文字第三平面(未正式使用) Tertiary Ideographic Plane,簡稱TIP
4號平面

13號平面
U+40000 - U+DFFFF (尚未使用)  
14號平面 U+E0000 - U+EFFFF 特別用途補(bǔ)充平面 Supplementary Special-purpose Plane,簡稱SSP
15號平面 U+F0000 - U+FFFFF 保留作為私人使用區(qū)(A區(qū))
Private Use Area-A,簡稱PUA-A
16號平面 U+100000 - U+10FFFF 保留作為私人使用區(qū)(B區(qū))
Private Use Area-B,簡稱PUA-B

增補(bǔ)字符是代碼點(diǎn)在 U+10000 至 U+10FFFF 范圍之間的字符(上述表格中1號平面~16號平面之間的),也就是那些使用原始的 Unicode 的 16 位設(shè)計(jì)無法表示的字符。從 U+0000 至 U+FFFF 之間的字符集有時(shí)候被稱為基本多語言面 (BMP)。因此,每一個(gè) Unicode 字符要么屬于 BMP,要么屬于增補(bǔ)字符。

實(shí)現(xiàn)方式

UTF-32、UTF-16 和 UTF-8 是具體的實(shí)現(xiàn)方案。Unicode的實(shí)現(xiàn)方式不同于編碼方式。一個(gè)字符的Unicode編碼是確定的。但是在實(shí)際傳輸過程中,由于不同系統(tǒng)平臺的設(shè)計(jì)不一定一致,以及出于節(jié)省空間的目的,對Unicode編碼的實(shí)現(xiàn)方式有所不同。Unicode的實(shí)現(xiàn)方式稱為Unicode轉(zhuǎn)換格式(Unicode Transformation Format,簡稱為UTF)。

例如,如果一個(gè)僅包含基本7位ASCII字符的Unicode文件,如果每個(gè)字符都使用2字節(jié)的原Unicode編碼傳輸,其第一字節(jié)的8位始終為0。這就造成了比較大的浪費(fèi)。對于這種情況,可以使用UTF-8編碼,這是一種變長編碼,它將基本7位ASCII字符仍用7位編碼表示,占用一個(gè)字節(jié)(首位補(bǔ)0)。而遇到與其他Unicode字符混合的情況,將按一定算法轉(zhuǎn)換,每個(gè)字符使用1-3個(gè)字節(jié)編碼,并利用首位為0或1進(jìn)行識別。這樣對以7位ASCII字符為主的西文文檔就大幅節(jié)省了編碼長度(具體方案參見UTF-8)。類似的,對未來會出現(xiàn)的需要4個(gè)字節(jié)的輔助平面字符和其他UCS-4擴(kuò)充字符,2字節(jié)編碼的UTF-16也需要通過一定的算法進(jìn)行轉(zhuǎn)換。

再如,如果直接使用與Unicode編碼一致(僅限于BMP字符)的UTF-16編碼,由于每個(gè)字符占用了兩個(gè)字節(jié),在麥金塔電腦(Mac)機(jī)和個(gè)人電腦上,對字節(jié)順序的理解是不一致的。這時(shí)同一字節(jié)流可能會被解釋為不同內(nèi)容,如某字符為十六進(jìn)制編碼4E59,按兩個(gè)字節(jié)拆分為4E和59,在Mac上讀取時(shí)是從低字節(jié)開始,那么在Mac OS會認(rèn)為此4E59編碼為594E,找到的字符為“奎”,而在Windows上從高字節(jié)開始讀取,則編碼為U+4E59的字符為“乙”。就是說在Windows下以UTF-16編碼保存一個(gè)字符“乙”,在Mac OS環(huán)境下打開會顯示成“奎”。此類情況說明UTF-16的編碼順序若不加以人為定義就可能發(fā)生混淆,于是在UTF-16編碼實(shí)現(xiàn)方式中使用了大端序(Big-Endian,簡寫為UTF-16 BE)、小端序(Little-Endian,簡寫為UTF-16 LE)的概念,以及可附加的字節(jié)順序記號解決方案,目前在PC機(jī)上的Windows系統(tǒng)和Linux系統(tǒng)對于UTF-16編碼默認(rèn)使用UTF-16 LE。(具體方案參見UTF-16)

此外Unicode的實(shí)現(xiàn)方式還包括UTF-7、Punycode、CESU-8、SCSU、UTF-32、GB18030等,這些實(shí)現(xiàn)方式有些僅在一定的國家和地區(qū)使用,有些則屬于未來的規(guī)劃方式。目前通用的實(shí)現(xiàn)方式是UTF-16小端序(LE)、UTF-16大端序(BE)和UTF-8。在微軟公司W(wǎng)indows XP附帶的記事本(Notepad)中,“另存為”對話框可以選擇的四種編碼方式除去非Unicode編碼的ANSI(對于英文系統(tǒng)即ASCII編碼,中文系統(tǒng)則為GB2312或Big5編碼)外,其余三種為“Unicode”(對應(yīng)UTF-16 LE)、“Unicode big endian”(對應(yīng)UTF-16 BE)和“UTF-8”。

代碼點(diǎn)、碼位

在字符編碼術(shù)語中,碼位或稱編碼位置,即英文的code point或code position,是組成碼空間(或代碼頁)的數(shù)值。 例如,ASCII碼包含128個(gè)碼位,范圍是016進(jìn)制到7F16進(jìn)制,擴(kuò)展ASCII碼包含256個(gè)碼位,范圍是016進(jìn)制到FF16進(jìn)制,而Unicode包含1,114,112個(gè)碼位,范圍是016進(jìn)制到10FFFF16進(jìn)制。Unicode碼空間劃分為17個(gè)Unicode字符平面(基本多文種平面,16個(gè)輔助平面),每個(gè)平面有65,536(= 216)個(gè)碼位。因此Unicode碼空間總計(jì)是17 × 65,536 = 1,114,112.

代碼單元、碼元

碼元(Code Unit,也稱“代碼單元”)是指一個(gè)已編碼的文本中具有最短的比特組合的單元。對于UTF-8來說,碼元是8比特長;對于UTF-16來說,碼元是16比特長;對于UTF-32來說,碼元是32比特長。碼值(Code Value)是過時(shí)的用法。
明白了上述兩個(gè)概念,我們就可以認(rèn)為UTF-N(N為8,16,32)干的事就是把Unicode字符集的抽象碼位映射為N位長的整數(shù)(即碼元)的序列,用于數(shù)據(jù)存儲或傳遞。

UTF-32 即將每一個(gè) Unicode 代碼點(diǎn)表示為相同值的 32 位整數(shù)。很明顯,它是內(nèi)部處理最方便的表達(dá)方式,但是,如果作為一般字符串表達(dá)方式,則要消耗更多的內(nèi)存。

UTF-16 使用一個(gè)或兩個(gè)未分配的 16 位代碼單元的序列對 Unicode 代碼點(diǎn)進(jìn)行編碼。值 U+0000 至 U+FFFF 編碼為一個(gè)相同值的 16 位單元。增補(bǔ)字符編碼為兩個(gè)代碼單元,第一個(gè)單元來自于高代理范圍(U+D800 至 U+DBFF),第二個(gè)單元來自于低代理范圍(U+DC00 至 U+DFFF)。這在概念上可能看起來類似于多字節(jié)編碼,但是其中有一個(gè)重要區(qū)別:值 U+D800 至 U+DFFF 保留用于 UTF-16;沒有這些值分配字符作為代碼點(diǎn)。這意味著,對于一個(gè)字符串中的每個(gè)單獨(dú)的代碼單元,軟件可以識別是否該代碼單元表示某個(gè)單單元字符,或者是否該代碼單元是某個(gè)雙單元字符的第一個(gè)或第二單元。這相當(dāng)于某些傳統(tǒng)的多字節(jié)字符編碼來說是一個(gè)顯著的改進(jìn),在傳統(tǒng)的多字節(jié)字符編碼中,字節(jié)值 0x41 既可能表示字母“A”,也可能是一個(gè)雙字節(jié)字符的第二個(gè)字節(jié)。

UTF-8 使用一至四個(gè)字節(jié)的序列對編碼 Unicode 代碼點(diǎn)進(jìn)行編碼。U+0000 至 U+007F 使用一個(gè)字節(jié)編碼,U+0080 至 U+07FF 使用兩個(gè)字節(jié),U+0800 至 U+FFFF 使用三個(gè)字節(jié),而 U+10000 至 U+10FFFF 使用四個(gè)字節(jié)。UTF-8 設(shè)計(jì)原理為:字節(jié)值 0x00 至 0x7F 始終表示代碼點(diǎn) U+0000 至 U+007F(Basic Latin 字符子集,它對應(yīng) ASCII 字符集)。這些字節(jié)值永遠(yuǎn)不會表示其他代碼點(diǎn),這一特性使 UTF-8 可以很方便地在軟件中將特殊的含義賦予某些 ASCII 字符。

下表所示為幾個(gè)字符不同表達(dá)方式的比較:

Unicode 代碼點(diǎn) U+0041 U+00DF U+6771 U+10400
表示字形
UTF-32 代碼單元
00000041
000000DF
00006771
00010400
UTF-16 代碼單元
0041
00DF
6771
D801 DC00
UTF-8 代碼單元
41
C3 9F
E6 9D B1
F0 90 90 80

注:上述編碼中的數(shù)字均是十六進(jìn)制表示的。

總結(jié)

以上就是本文關(guān)于淺談Java中Unicode的編碼和實(shí)現(xiàn)的全部內(nèi)容,希望對大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站:Java編程將漢字轉(zhuǎn)Unicode碼代碼示例、Java源碼解析之object類等,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!

相關(guān)文章

  • java普通類如何轉(zhuǎn)javafx程序

    java普通類如何轉(zhuǎn)javafx程序

    這篇文章主要介紹了java普通類如何轉(zhuǎn)javafx程序方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • maven加入spring框架的詳細(xì)教程

    maven加入spring框架的詳細(xì)教程

    這篇文章主要介紹了maven加入spring框架的詳細(xì)教程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-10-10
  • 關(guān)于Java整合RabbitMQ實(shí)現(xiàn)生產(chǎn)消費(fèi)的7種通訊方式

    關(guān)于Java整合RabbitMQ實(shí)現(xiàn)生產(chǎn)消費(fèi)的7種通訊方式

    這篇文章主要介紹了關(guān)于Java整合RabbitMQ實(shí)現(xiàn)生產(chǎn)消費(fèi)的7種通訊方式,消息中間件是基于隊(duì)列與消息傳遞技術(shù),在網(wǎng)絡(luò)環(huán)境中為應(yīng)用系統(tǒng)提供同步或異步、可靠的消息傳輸?shù)闹涡攒浖到y(tǒng),需要的朋友可以參考下
    2023-05-05
  • java中的構(gòu)造函數(shù)什么時(shí)候被調(diào)用執(zhí)行

    java中的構(gòu)造函數(shù)什么時(shí)候被調(diào)用執(zhí)行

    這篇文章主要介紹了java中的構(gòu)造函數(shù)什么時(shí)候被調(diào)用執(zhí)行問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • idea中啟動項(xiàng)目彈出 IDEA out of memory窗口的解決方案

    idea中啟動項(xiàng)目彈出 IDEA out of memory窗口的解決方案

    這篇文章主要介紹了idea中啟動項(xiàng)目彈出 IDEA out of memory窗口的解決方案,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • Java線程池獲取池中所有線程列表的方法總結(jié)

    Java線程池獲取池中所有線程列表的方法總結(jié)

    在Java中,獲取線程池中所有線程列表并不是一個(gè)直接支持的功能,因?yàn)榫€程池的設(shè)計(jì)通常是為了隱藏和管理底層的線程細(xì)節(jié),從而提供更高層次的抽象和并發(fā)控制能力,本文給大家介紹了Java線程池獲取池中所有線程列表的方法,需要的朋友可以參考下
    2024-10-10
  • Java中的BlockingQueue阻塞隊(duì)列原理以及實(shí)現(xiàn)詳解

    Java中的BlockingQueue阻塞隊(duì)列原理以及實(shí)現(xiàn)詳解

    這篇文章主要介紹了Java中的BlockingQueue阻塞隊(duì)列原理以及實(shí)現(xiàn)詳解,在最常見的使用到這個(gè)阻塞隊(duì)列的地方,就是我們耳熟能詳?shù)木€程池里面了,作為我們線程池的一大最大參與者,也是AQS的一個(gè)具體實(shí)現(xiàn),需要的朋友可以參考下
    2023-12-12
  • Java中的PrintWriter 介紹_動力節(jié)點(diǎn)Java學(xué)院整理

    Java中的PrintWriter 介紹_動力節(jié)點(diǎn)Java學(xué)院整理

    PrintWriter 是字符類型的打印輸出流,它繼承于Writer。接下來通過本文給大家介紹java中的 PrintWriter 相關(guān)知識,感興趣的朋友一起學(xué)習(xí)吧
    2017-05-05
  • Java實(shí)現(xiàn)微信公眾號自定義菜單的創(chuàng)建方法示例

    Java實(shí)現(xiàn)微信公眾號自定義菜單的創(chuàng)建方法示例

    這篇文章主要介紹了Java實(shí)現(xiàn)微信公眾號自定義菜單的創(chuàng)建方法,結(jié)合實(shí)例形式分析了java創(chuàng)建微信公眾號自定義菜單的具體步驟、實(shí)現(xiàn)方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下
    2019-10-10
  • SpringBoot容器的主要組件詳解

    SpringBoot容器的主要組件詳解

    這篇文章主要介紹了SpringBoot容器的主要組件詳解,SpringBoot?是基于?Spring?Framework?的一種快速開發(fā)框架,它可以幫助開發(fā)者快速地構(gòu)建獨(dú)立的、生產(chǎn)級別的、可部署的應(yīng)用程序,需要的朋友可以參考下
    2023-09-09

最新評論

浮梁县| 墨脱县| 特克斯县| 且末县| 金塔县| 古田县| 鄢陵县| 大渡口区| 吉木萨尔县| 宾川县| 贵德县| 西乌珠穆沁旗| 新河县| 宁国市| 新巴尔虎左旗| 商城县| 分宜县| 鞍山市| 平遥县| 霍林郭勒市| 沅陵县| 稻城县| 福鼎市| 龙井市| 高密市| 玉环县| 长汀县| 无锡市| 富川| 澜沧| 双峰县| 鞍山市| 道孚县| 枞阳县| 嵊泗县| 安顺市| 依兰县| 鲁甸县| 衡南县| 页游| 冀州市|