Vc下unicode和UTF8相互轉換

2021-06-02 16:24:49 字數 4157 閱讀 8587

一, utf8 轉 unicode

cstring utf8tounicode(char* utf8)

dword dwunicodelen;        //轉換後unicode的長度

tchar *pwtext;            //儲存unicode的指標

cstring strunicode;        //返回值

//獲得轉換後的長度,並分配記憶體

dwunicodelen = multibytetowidechar(cp_utf8,0,utf8,-1,null,0);

pwtext = new tchar[dwunicodelen];

if (!pwtext)

return strunicode;

//轉為unicode

multibytetowidechar(cp_utf8,0,utf8,-1,pwtext,dwunicodelen);

//轉為cstring

strunicode.format(_t("%s"),pwtext);

//清除記憶體

delete pwtext;

//返回轉換好的unicode字串

return strunicode;

二, unicode轉

utf8

size_t cdgqdialog::g_f_wctou8(char * dest_str, const wchar_t src_wchar)

int count_bytes = 0;

wchar_t byte_one = 0, byte_other = 0x3f; // 用於位與運算以提取位值0x3f--->00111111

unsigned char utf_one = 0, utf_other = 0x80; // 用於"位或"置標utf-8編碼0x80--->1000000

wchar_t tmp_wchar =l'0'; // 用於寬字元位置析取和位移(右移位)

unsigned char tmp_char =l'0';

if (!src_wchar)//

return (size_t)-1;

for (;;) // 檢測位元組序列長度

if (src_wchar <= 0x7f){ // <=01111111

count_bytes = 1; // ascii字元: 0******x( ~ 01111111)

byte_one = 0x7f; // 用於位與運算, 提取有效位值, 下同

utf_one = 0x0;

break;

if ( (src_wchar > 0x7f) && (src_wchar <= 0x7ff) ){ // <=0111,11111111

count_bytes = 2; // 110***xx 10******[1](最多個位, 簡寫為*1)

byte_one = 0x1f; // 00011111, 下類推(1位的數量遞減)

utf_one = 0xc0; // 11000000

break;

if ( (src_wchar > 0x7ff) && (src_wchar <= 0xffff) ){ //0111,11111111<=11111111,11111111

count_bytes = 3; // 1110***x 10******[2](maxbits: 16*1)

byte_one = 0xf; // 00001111

utf_one = 0xe0; // 11100000

break;

if ( (src_wchar > 0xffff) && (src_wchar <= 0x1fffff) ){ //對ucs-4的支援..

count_bytes = 4; // 11110*** 10******[3](maxbits: 21*1)

byte_one = 0x7; // 00000111

utf_one = 0xf0; // 11110000

break;

if ( (src_wchar > 0x1fffff) && (src_wchar <= 0x3ffffff) ){

count_bytes = 5; // 111110xx 10******[4](maxbits: 26*1)

byte_one = 0x3; // 00000011

utf_one = 0xf8; // 11111000

break;

if ( (src_wchar > 0x3ffffff) && (src_wchar <= 0x7fffffff) ){

count_bytes = 6; // 1111110x 10******[5](maxbits: 31*1)

byte_one = 0x1; // 00000001

utf_one = 0xfc; // 11111100

break;

return (size_t)-1; // 以上皆不滿足則為非法序列

// 以下幾行析取寬位元組中的相應位, 並分組為utf-8編碼的各個位元組

tmp_wchar = src_wchar;

for (int i = count_bytes; i > 1; i--)

{ // 乙個寬字元的多位元組降序賦值

tmp_char = (unsigned char)(tmp_wchar & byte_other);///后位與byte_other 00111111

dest_str[i - 1] = (tmp_char | utf_other);/// 在前面加----跟或

tmp_wchar >>= 6;//右移位

//這個時候i=1

//對utf-8第乙個位元組位處理,

//第乙個位元組的開頭"1"的數目就是整個串中位元組的數目

tmp_char = (unsigned char)(tmp_wchar & byte_one);//根據上面附值得來,有效位個數

dest_str[0] = (tmp_char | utf_one);//根據上面附值得來1的個數

// 位值析取分組__end!

return count_bytes;

int cdgqdialog::g_f_wcs_to_pchar(cstring& wstr,char * p)

wchar_t wc=l'1';

char c[10]="1";//申請乙個快取

size_t r=0; //size_t unsigned integer result of sizeof operator

int i=0;

int j=0;

for(i=0;iwc=wstr.getat(i);//得到乙個寬字元

r=g_f_wctou8(c,wc);//將乙個寬字元按utf-8格式轉換到p位址

if(r==-1)//出錯判斷

afxmessagebox(_t("wcs_to_pchar error"));

p[j]=c[0];//第乙個值附給p

j++; 

if(r>1) 

for(size_t x=1;xp[j]=c[x];

j++;

//p[j]='0';

return 1;

三.轉換例項

void cmytestdlg::onbnclickedbutton2()

// todo: 在此新增控制項通知處理程式**

cstring ccid=l"2007071王";

cstring sql;

char mysql[100];

memset(mysql,0,sizeof(mysql));

sql.format(l"select cxrq,cxdw,dxrq,dxdw,fxrq,fxdw,cx,flx from j_clxx where trainnum_info_id ='%s'",ccid);

//wchar_t sql=l'你';

g_f_wcs_to_pchar(sql,mysql);

cstring sql1 =utf8tounicode(mysql);

messagebox(sql);

//g_f_wctou8(mysql,sql);

//   cstring str_temp;

//   for (int i=90;i//   str_temp.format(l"%c",mysql[i]);

//   messagebox(str_temp);

Vc下unicode和UTF8相互轉換

在vc下使用sqlite資料庫時,由於sql語句使用utf8 編碼,而cstring 是unicode編碼。一,utf8 轉 unicode cstring utf8tounicode char utf8 轉為unicode multibytetowidechar cp utf8,0,utf8,1,...

簡單聊下Unicode和UTF 8

今晚聽同事分享提到這個,簡單總結下。unicode字符集 unicode的出現是因為ascii等其他編碼碼不夠用了,比如ascii是英語為母語的人發明的,只要乙個位元組8位就能夠表示26個英文本母了,但是當跨區域進行資訊交流的時候,尤其是internet的出現,除了 a b c 還有 你 我 他 需...

unicode和utf8的關係

很久以前儲存的,別人寫的但是很明了 很久很久以前,有一群人,他們決定用8個可以開合的電晶體來組合成不同的狀態,以表示世界上的萬物。他們看到8個開關狀態是好的,於是他們把這稱為 位元組 再後來,他們又做了一些可以處理這些位元組的機器,機器開動了,可以用位元組來組合出很多狀態,狀態開始變來變去。他們看到...