檔案編碼的判定(UTF8,UTF16),及轉換

2021-05-23 01:39:28 字數 1463 閱讀 4435

1.首先根據bom來判定

utf-8的bom:   ef bb bf; 對應的十進位制數值是:239 187 191 如果檔案的開頭三個位元組與之相符則說明檔案的編碼是utf8的

utf-16le的bom: ff fe;   對應的十進位制數值是: 255 254  如果檔案的開頭兩個位元組與之相符則說明對應的編碼是utf-16le

utf-16be的bom: fe ff ;   對應的十進位制數值是:254  255 如果檔案的開頭兩個位元組與之相符則說明對應的編碼是utf-16be

2.bom不存在的情況判定

utf-8的判定,根據內容判定

utf-8的編碼規則:

字元位元組長度        標誌位元組        值

一位元組長            0******x

兩位元組長            110***xx  10******

三位元組長            1110***x  10****** 10******

四位元組長            11110***  10****** 10****** 10******

**標誌位元組判定用到的資料**

定義陣列bthead 長度為4儲存用來判定標誌位元組的十進位制數值: 0,192, 224, 240

定義陣列btbitandvalue 長度為4儲存用來得到標誌位元組長度的十進位制數值:128: 224, 240, 248

**值判定用到的資料**

定義變數btvaluehead用來儲存值得標誌所對應的十進位制數值:128

定義變數btfixvalueand 儲存用來取得值的標誌的十進位制數值:192

a.以位元組方式讀取檔案中內容儲存到位元組陣列中

b.對a中讀取的檔案內容做loop操作。

首先對當前的位元組分別與btbitandvalue中的四個值進行位與操作,每次得到的值與bthead中的值比較,找到相等的值時可以根據當前的   值來判定字元的位元組長度l。並執行下乙個迴圈,在跳過b的操作次數(l - 1)次時在執行b操作

c.取得值的標誌。 將此致的值與btfixvalueand進行位與操作,將取得的值與btvaluehead進行比較,如果相等則對下乙個位元組繼續執行c操作,直到執行的次數是l-1次。如果不相等則說明不是utf-8編碼格式。

utf-16的判定與utf-8的判定類似只要知道編碼規則就可以。

3. 文字code的轉換操作

轉換操作用到的api:

多位元組轉寬位元組:multibytetowidechar

寬位元組轉多位元組:widechartomultibyte

msdn有詳細引數說明。

具體步驟:  首先判定要儲存轉換結果字串的長度,相應引數設定成固定的值便可以得到。

其次,根據得到的長度分配儲存變數

最後,進行轉換。

注意分配的記憶體釋放問題。

介紹utf8編碼

utf8並不算是一種電腦編碼,而是一種儲存和傳送的格式,如前所述,每個unicode ucs字元都以 2或4個bytes來儲存,看看以下的比較 以 i am chinese 為例 用ansi儲存 12 bytes 用unicode ucs2儲存 24 bytes 2 bytes header 用uc...

UTF8編碼 解碼

參考文件 rfc3629標準.對於任意乙個字,都可以用乙個唯一碼 unicode碼,由標準編制 表示,在應用過程中,需要對碼進行編碼.常用的編碼方式為utf 8.utf 8採用類似於ip位址分配的機制.即對於不同範圍的unicode碼,採用不同的模板進行編碼.流程概述為 2.1 查表獲取unicod...

utf8的編碼演算法

unicode字符集是我們世界上最完善最全面的字符集,幾乎包含了世界上所有的字元。其實可以這麼理解,unicode字符集是一張巨大的 把世界上各種語言的字元和標點符號都編排到裡面,然後按照一定的順序給每個字元排號 很遺憾的是對於中文來說,這個順序不是按照漢語拼音的順序 有了這張巨大的 世界上大部分字...