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

UTF8和GBK編碼互轉(zhuǎn)實現(xiàn)解析

 更新時間:2023年07月21日 11:03:16   作者:BEARZPY  
這篇文章主要為大家介紹了UTF8和GBK編碼互轉(zhuǎn)實現(xiàn)解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

基本知識

UTF8 本質(zhì)是 Unicode 標(biāo)準(zhǔn)的一種實現(xiàn)方式,UTF8 編碼和 Unicode 字符碼是有相互轉(zhuǎn)換的規(guī)則的。GBK 碼與 Unicode 字符碼是沒有設(shè)計有規(guī)律的對應(yīng)關(guān)系的,即沒有相互轉(zhuǎn)換的規(guī)則。所以想要實現(xiàn) UTF8 和 GBK 編碼互轉(zhuǎn)需要依靠查表法,即 UTF8 轉(zhuǎn) GBK 編碼需要先按規(guī)則轉(zhuǎn)換成 Unicode 字符碼,再通過查表獲取該 Unicode 字符碼對應(yīng)的 GBK 碼,同樣的 GBK 轉(zhuǎn) UTF8 編碼也需要先查表獲取對應(yīng)的 Unicode 字符碼,再按照規(guī)則轉(zhuǎn)換成 UTF8 編碼。

獲取 GBK 和 Unicode 的編碼對應(yīng)表

這里介紹兩個編碼對應(yīng)表,分別是 CP936 編碼表,和漢字 Unicode 編碼表,包含的漢字都是基本漢字,一共 20902 個。除去 ASCII 字符外,這些編碼中包括的漢字都是兩個字節(jié)的長度。 其中 CP936 編碼表是按照遞增的 GBK 編碼值為索引的,對應(yīng)值是 Unicode 編碼,(由于 GBK 的編碼并不是連續(xù)的,所有索引之間往往有空缺),而漢字 Unicode 編碼表是以遞增的 Unicode 漢字字符碼為索引的,對應(yīng)值是 GBK 編碼(Unicode 編碼范圍 4E00-9FA5) 。

實現(xiàn)互轉(zhuǎn)

在獲取編碼表之后,想要實現(xiàn) GBK 和 Unicode 互轉(zhuǎn)的功能就沒有什么難度了,最簡單的方法就是定義一個編碼數(shù)組包含 GBK 和 Unicode 的映射關(guān)系,然后對所需要轉(zhuǎn)換的編碼進行查表,獲取對應(yīng)編碼再拼接成一個數(shù)據(jù)串就完成了。

采用 CP936 編碼表:
需要定義一個 short 型二維數(shù)組存放 GBK 和 Unicode 的映射關(guān)系(因為 GBK 編碼值不是遞增的,中間有很多未使用的值),無論是 GBK 轉(zhuǎn) Unicode 還是 Unicode 轉(zhuǎn) GBK 使用時最長需要遍歷整個數(shù)組。

采用漢字 Unicode 編碼表:
需要定義一個 short 型一維數(shù)組,存放從 4E00-9FA5 直接的漢字字符,Unicode 的編碼字符減去 4E00 既是一維數(shù)組的索引。在 Unicode 轉(zhuǎn) GBK 時可以直接計算出對應(yīng) GBK 的索引值,直接獲取該編碼值即可。在 GBK 轉(zhuǎn) Unicode 的時候最長需要遍歷整個數(shù)組。

明顯可以看出來,使用漢字 Unicode 編碼表的時間復(fù)雜度和空間復(fù)雜度是低于使用 CP936 編碼表的,不做優(yōu)化的話,這里肯定選擇漢字 Unicode 編碼表。

優(yōu)化占用空間

缺點:
上面雖然實現(xiàn)了 GBK 和 Unicode 的互相轉(zhuǎn)換,但是在程序里面定一個 20902 長度的 short 數(shù)組還是太臃腫了,而且在某些情況嵌入式系統(tǒng)中是不允許定義這么多的。

優(yōu)化:
這里我們可以把編碼表改造成字庫文件。在帶操作系統(tǒng)的環(huán)境下以讀取文件的方式來讀取字符編碼。在嵌入式系統(tǒng)中沒有文件系統(tǒng)的環(huán)境下,我們可以把字庫文件燒入 Flash,以讀取 Flash 的方式來讀取字符編碼。

制作字庫文件:
漢字 Unicode 編碼表制作字庫文件并不復(fù)雜,新建一個 .txt 文件(以 ANSI 格式打開),將 Unicode 4E00-9FA5 對應(yīng)的 GBK 編碼依次復(fù)制到文件中保存,修改名字為 GBK.bin 就可以了。(這里 GBK.bin 是沒有文件頭和校驗值的,直接按照索引讀取就行,需要注意的事這里不能有換行符)

優(yōu)化查找編碼速度

缺點:

使用 GBK.bin 優(yōu)化了程序占用的空間,但是 GBK 轉(zhuǎn) Unicode 的時候最長仍需要遍歷整個字庫文件,而且有一部分常用的字符是在 4E00-9FA5 后段部分的,這就導(dǎo)致了很多情況下查找效率的降低。

優(yōu)化:

漢字 Unicode 編碼表是根據(jù) Unicode 排序的,CP936 編碼表是根據(jù) GBK 排序的,我們可以將 CP936 編碼表也制作成字庫 CP936.bin,在 GBK 轉(zhuǎn) Unicode 的時候使用字庫 CP936.bin,在 Unicode 轉(zhuǎn) GBK 時使用 GBK.bin,這樣互轉(zhuǎn)都是按照編碼索引轉(zhuǎn)換成字庫索引直接讀取對應(yīng)字庫,就省去了遍歷的過程。

制作字庫文件:

CP936 編碼表中的一部分
GBK     Unicode
0x81FD    0x4FA1
0x81FE    0x4FA2
0x8240    0x4FA4
0x8241    0x4FAB

如上所示,GBK 的索引是不連續(xù)的,81FE 后面接的是 8240,實際上整個 CP936 中類似于此的斷層大概有一百多處,每處缺少的數(shù)目是不一樣的,這里我們可以通過編寫程序?qū)⑵溲a全索引,對于的 Unicode 的值設(shè)置成 0000,并寫入 GBK.bin 文件(這里對于大的斷層我們進過濾,并在后面的索引計算中進行特殊處理,以免補出來的 bin 文件過大)。

優(yōu)化字串轉(zhuǎn)換速度

上面都是單個編碼去計算索引,讀取文件獲取編碼返回,在大量的字符串轉(zhuǎn)換的時候會有很多冗余的操作,我們可以進行流程上的優(yōu)化,把所有需要獲取的字符編碼先全部轉(zhuǎn)換成索引,然后在去字庫中一次將所有需要的內(nèi)容都讀出來統(tǒng)一返回,這樣減少了流程上的調(diào)用。

UTF8 和 Unicode 的互轉(zhuǎn)

GBK 和 Unicode 的互轉(zhuǎn)已經(jīng)實現(xiàn)了,剩下的就是 UTF8 和 Unicode 的轉(zhuǎn)換,這部分就有固定的轉(zhuǎn)換規(guī)則如下:

UTF8 編碼規(guī)則:如果只有一個字節(jié)則其最高二進制位為 0,如果是多字節(jié),其第一個字節(jié)從最高位開始,連續(xù)的二進制位值為 1,1 的個數(shù)決定了其編碼的字節(jié)數(shù),其余各字節(jié)均以 10 開頭。

// Unicode6.1定義范圍:0~10 FFFF
// 20 0000 ~ 3FF FFFF 和 400 0000 ~ 7FFF FFFF 屬于 UCS-4,UTF8 現(xiàn)在已經(jīng)棄用了這部分內(nèi)容
---------------------------------------------------------------------------------
n | Unicode (十六進制)     | UTF - 8 (二進制)
--+-----------------------+------------------------------------------------------
1 | 0000 0000 - 0000 007F | 0xxxxxxx
2 | 0000 0080 - 0000 07FF | 110xxxxx 10xxxxxx
3 | 0000 0800 - 0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
4 | 0001 0000 - 0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
---------------------------------------------------------------------------------
// 以下部分棄用
5 | 0020 0000 - 03FF FFFF | 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
6 | 0400 0000 - 7FFF FFFF | 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
---------------------------------------------------------------------------------

以上就是UTF8和GBK編碼互轉(zhuǎn)實現(xiàn)解析的詳細內(nèi)容,更多關(guān)于UTF8 GBK編碼互轉(zhuǎn)的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • pytorch從頭開始搭建UNet++的過程詳解

    pytorch從頭開始搭建UNet++的過程詳解

    大家都知道Unet是一個最近比較火的網(wǎng)絡(luò)結(jié)構(gòu),這篇文章主要介紹了pytorch從頭開始搭建UNet++的過程詳解,需要的朋友可以參考下
    2022-11-11
  • git驗證線上的版本是否符合預(yù)期

    git驗證線上的版本是否符合預(yù)期

    當(dāng)我們想知道部署項目的哪個版本有問題?當(dāng)我們想知道線上運行的版本是否是我們預(yù)期的版本?當(dāng)我們想把部署的版本與代碼進行關(guān)聯(lián)?如果是你用git來做版本管理,那就可以使用git-commit-id-maven-plugin插件來實現(xiàn)上述功能
    2022-07-07
  • 12種最常用的網(wǎng)頁編程語言簡介(值得收藏)

    12種最常用的網(wǎng)頁編程語言簡介(值得收藏)

    隨著網(wǎng)站的越來越普及,與Web相關(guān)的開發(fā)技術(shù)持續(xù)熱門,從開始簡單的html到復(fù)雜的web開發(fā)語言asp、asp.net、php、jsp等等,在此,我就借助SEO馬龍博客的平臺跟大家簡單的介紹一下常見的12種網(wǎng)頁編程語言
    2017-01-01
  • conda常用命令整理及用法詳解

    conda常用命令整理及用法詳解

    這篇文章主要為大家介紹了conda常用命令整理及用法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-01-01
  • 關(guān)于使用SQOOP抽數(shù)到Hive遇到的問題

    關(guān)于使用SQOOP抽數(shù)到Hive遇到的問題

    這篇文章主要介紹了關(guān)于使用SQOOP抽數(shù)到Hive遇到的問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • 詳解HTTP協(xié)議簡介

    詳解HTTP協(xié)議簡介

    HTTP是訪問互聯(lián)網(wǎng)使用的核心通信協(xié)議,也是所有web應(yīng)用程序使用的通信協(xié)議。下面通過本文給大家介紹HTTP協(xié)議簡介的相關(guān)知識,感興趣的朋友一起學(xué)習(xí)吧
    2018-01-01
  • 詳解Metrics應(yīng)用監(jiān)控指標(biāo)的使用說明

    詳解Metrics應(yīng)用監(jiān)控指標(biāo)的使用說明

    這篇文章主要為大家詳細的介紹了Metrics應(yīng)用監(jiān)控指標(biāo)的使用說明,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2022-02-02
  • idea一直indexing無法操作的問題解決

    idea一直indexing無法操作的問題解決

    在使用idea 2020.3版本開發(fā)maven項目的時候,一直出現(xiàn)有效件index,idea基本上就沒辦法操作了,連跳入到類或方法里都跳不了,本文就來介紹一下解決方法,感興趣的可以了解一下
    2024-01-01
  • 高性能WEB開發(fā) 頁面呈現(xiàn)、重繪、回流。

    高性能WEB開發(fā) 頁面呈現(xiàn)、重繪、回流。

    在討論頁面重繪、回流之前。需要對頁面的呈現(xiàn)流程有些了解,頁面是怎么把html結(jié)合css等顯示到瀏覽器上的,下面的流程圖顯示了瀏覽器對頁面的呈現(xiàn)的處理流程。可能不同的瀏覽器略微會有些不同。但基本上都是類似的。
    2010-05-05
  • Git Push失?。篐TTP 413 Request Entity Too Large的問題排查和完整解決方法

    Git Push失?。篐TTP 413 Request Entity 

    在使用 Git 推送包含較大編譯產(chǎn)物的項目時,你是否遇到過 HTTP 413 Request Entity Too Large 錯誤?這通常并不是 Git 的問題,而是 Web 服務(wù)器拒絕接收大體積請求,本文將通過一個完整案例,實現(xiàn)大文件 Git 推送成功,需要的朋友可以參考下
    2026-01-01

最新評論

连城县| 阜平县| 荥阳市| 平果县| 永安市| 遂平县| 册亨县| 多伦县| 新疆| 泰顺县| 景洪市| 读书| 辽阳县| 绵阳市| 鹰潭市| 呼和浩特市| 平邑县| 民乐县| 恭城| 井陉县| 晋宁县| 合作市| 商南县| 清苑县| 广东省| 鹤壁市| 冀州市| 南召县| 曲周县| 柳州市| 连州市| 常山县| 独山县| 开鲁县| 南靖县| 黎平县| 昌平区| 新郑市| 萨嘎县| 武陟县| 裕民县|