一, 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個開關狀態是好的,於是他們把這稱為 位元組 再後來,他們又做了一些可以處理這些位元組的機器,機器開動了,可以用位元組來組合出很多狀態,狀態開始變來變去。他們看到...