中文編碼之間的轉換

2021-05-22 22:32:47 字數 3872 閱讀 2195

//主要思想:先將一種編碼用multibytetowidechar函式變為unicode編碼,再用widechartomultibyte函式變為另一種編碼。

/*********************************

multibytetowidechar

一、函式功能:該函式對映乙個字串到乙個unicode字串。  

二、函式原型:int multibytetowidechar(uint codepage, dword dwflags, lpcstr lpmultibytestr, int cchmultibyte, lpwstr lpwidecharstr, int cchwidechar);

三、引數說明:

1.codepage:指定執行轉換的編碼。常用的有cp_acp:ansi(gb*)、cp_utf8:utf-8

2.dwflags:一組位標記用以指出是否未轉換成預作或寬字元(若組合形式存在),是否使用象形文本替代控制字元,以及如何處理無效字元。

3.lpmultibytestr:指向將被轉換字串的字元。

4.cchmultibyte:指定由引數lpmultibytestr指向的字串中位元組的個數。如果這個值為-1,字串將被設定為以null為結束符的字串,並且自動計算長度。

5.lpwidecharstr:指向接收被轉換字串的緩衝區。

6.cchwidechar:指定由引數lpwidecharstr指向的緩衝區的位元組個數。若此值為零,函式返回緩衝區所必需的寬字元數,在這種情況下,lpwidecharstr中的緩衝區不被使用。

四、返回值:

1.如果函式執行成功,並且cchwidechar不為零,返回值是由lpwidecharstr指向的緩衝區中寫入的寬字元數;

2.如果函式執行成功,並且cchmultibyte為零,返回值是接收到待轉換字串的緩衝區所需求的寬字元數大小。

3.如果函式執行失敗,返回值為零。

五、注意: 指標lpmultibytestr和lpwidecharstr必須不一樣。

*****************************************/

/************************************

widechartomultibyte   

一、函式功能:該函式對映乙個unicode字串到乙個多位元組字串。   

二、函式原型:int widechartomultibyte(uint codepage, dword dwflags, lpwstr lpwidecharstr, int cchwidechar, lpcstr lpmultibytestr, int cchmultibyte, lpcstr lpdefaultchar, pbool pfuseddefaultchar );

三、引數說明:

1.codepage:指定執行轉換的編碼。

2.dwflags:一組位標記用以指出是否未轉換成預作或寬字元(若組合形式存在),是否使用象形文本替代控制字元,以及如何處理無效字元。

3.lpwidecharstr:指向將被轉換的unicode字串。

4.cchwidechar:指定由引數lpwidecharstr指向的緩衝區的字元個數。

5.lpmultibytestr:指向接收被轉換字串的緩衝區。

6.cchmultibyte:指定由引數lpmultibytestr指向的緩衝區最大值(用位元組來計量)。

7.lpdefaultchar:通常設為null。

8.pfuseddefaultchar:通常設為null。

四、返回值:

1.如果函式執行成功,並且cchmultibyte不為零,返回值是由 lpmultibytestr指向的緩衝區中寫入的位元組數;

2.如果函式執行成功,並且cchmultibyte為零,返回值是接收到待轉換字串的緩衝區所必需的位元組數。

3.如果函式執行失敗,返回值為零。

*****************************************/

#include #include //gbk編碼轉換到utf8編碼

int gbktoutf8(unsigned char * lpgbkstr,unsigned char * lputf8str,int nutf8strlen)

if(nutf8strlen < nretlen) //如果輸出緩衝區長度不夠則退出

nretlen = ::widechartomultibyte(cp_utf8,0,lpunicodestr,-1,(char *)lputf8str,nutf8strlen,null,null); //轉換到utf8編碼

if(lpunicodestr)

delete lpunicodestr;

return nretlen;

}// utf8編碼轉換到gbk編碼

int utf8togbk(unsigned char * lputf8str,unsigned char * lpgbkstr,int ngbkstrlen)

if(ngbkstrlen < nretlen) //如果輸出緩衝區長度不夠則退出

nretlen = ::widechartomultibyte(cp_acp,0,lpunicodestr,-1,(char *)lpgbkstr,nretlen,null,null); //轉換到gbk編碼

if(lpunicodestr)

delete lpunicodestr;

return nretlen;

}//使用這兩個函式的例子

int main()

else

fp = fopen("c:/gbk轉utf8.txt","wb"); //儲存到文字檔案

fwrite(lputf8str,nretlen,1,fp);

fclose(fp);

getchar(); //先去開啟那個文字檔案看看,單擊記事本的「檔案」-「另存為」選單,在對話方塊中看到編碼框變為了「utf-8」說明轉換成功了

nretlen = utf8togbk((unsigned char *)lputf8str,null,null); //再轉回來

printf("轉換後的字串需要的空間長度為:%d ",nretlen);

lpgbkstr = new char[nretlen + 1];

nretlen = utf8togbk((unsigned char *)lputf8str,(unsigned char *)lpgbkstr,nretlen);

if(nretlen)

else

fp = fopen("c:/utf8轉gbk.txt","wb"); //儲存到文字檔案

fwrite(lpgbkstr,nretlen,1,fp);

fclose(fp);

getchar(); //再去開啟文字檔案看看,發現編碼框又變為了「ansi」說明轉換成功了

ret0:

if(lpgbkstr)

delete lpgbkstr;

if(lputf8str)

delete lputf8str;

return 0;

}

以下是linux下的**,從big5到utf8的例子

#include #include #include #include #include #include #define size 1024*1024

int transcoding(char *fromcode,char *tocode,char *from,int from_len,char *to,int to_len)

//./test big5 utf-8 big5.txt utf8.txt

int main(int argc,char **argv)

字元編碼之間的轉換

在嚴格的ascii中,每個字元用7位元表示,一共規定了128個字元的編碼 unicode拓展自ascii字符集,使用全16位字符集,可以表示全世界上所有的書寫語言中可能用於電腦通訊的字元 象形文本和其他符號。但不支援一些古老的文字。utf 8是一種針對unicode的可變長寬字元編碼,又稱為萬國碼 ...

中文與ASCII之間的轉換

我們在開發使時常會用到資源檔案,這可能是為了多語言 國際化的需要,也可能是使用了國外開源專案的原因,這就需要將中文轉換為 ascii 編碼,或者將 ascii 轉換為中文,那麼我們就可以使用 jdk自帶的轉換工具 native2ascii for example no1 中文轉換為 ascii 編碼...

Python的中文編碼轉換問題

與伺服器進行資料交換時,尤其是資料中含有中文時,要注意中文的編碼問題。要選擇伺服器接受的編碼方式,否則會造成顯示亂碼。經驗 實驗室伺服器的資料庫,中文用utf 8編碼,但我提交的是gbk編碼的中文,結果出現亂碼 基本能解決大陸上的編碼問題。簡單解釋一下 首先判斷傳入的mes是否是unicode編碼,...