UTF-8、GB2312、Unicode相互转换

    对于Windows平台下的开发而言,字符串的转换本不应成为问题,MS都已做好了现成的API,只需简单调用就OK了。但是,论坛上还是有朋友不断的询问如果在各编码集间进行字符串的转换,也不断的有“高手”走出来解惑,甚至还贴出整页的山寨版转换代码,不看还好,越看越迷惑,越看越偏离正确的方向。

    首先,需明确:在此讨论的字符集为ANSI和Unicode。GB2312汉字编码隶属于ANSI,数字及字母占一个字节,汉字占两个字节,其特征是信息元非定长;而Unicode(Universal Character Set 通用字符集)则不论是数字、字母还是汉字或其他语言的字符,都统统使用固定长度来表示一个字符,UCS-2使用两个字节来表示一个字符,UCS-4则使用4个字节表示一个字符。那么UTF-8是什么字符集呢?UTF即Unicode Transformation Format,也就是针对Unicode的传输编码方式(并非是另一种与Unicode或ANSI相对的字符集),从这个意义上说UTF-8自然该隶属于Unicode,换句话说,UTF是一种对Unicode字符集的表现形式或者说是Unicode的一种实现方式。UTF又可细分为:UTF-8、UTF-16、UTF-32,它们之间的区在于最小信息单元的长度,长度依次为单字节、双字节、四字节。

    在Windows平台下,用MultiByteToWideChar和WideCharToMultiByte这两个函数就能实现字符串格式间的互相转换。在此用“字符格式”这样模糊的词汇,而没有说“字符串编码”,主要是因为UTF-8实在算不上是“字符集”,仅仅是Unicode的一种表现形式而已。按照字符串在Windows系统中的存储方式,可以分为MultiByte和WideChar(可能没有这种说法,为了与函数名对应,偷个懒)。MultiByte,望文生义,就是用多字节串来存储字符串。在MultiByte字符串包含一个字节长的字符,也包含多字节长的字符,因此ANSI和UTF都应归于此类。呵呵,有点晕吧?先忘掉ANSI和Unicode,接下来再说WideChar。WideChar即宽字符,在Windows下固定用两个字节来表示一个字符,可以简单的与Unicode中的UCS-2对应起来。MultiByteToWideChar和WideCharToMultiByte函数的视角是字符串的表达方式,而不是字符的编码方式,因此ANSI和UTF-8可以被归到MultiByte类型中。

int MultiByteToWideChar(
  UINT CodePage,         // code page
  DWORD dwFlags,         // character-type options
  LPCSTR lpMultiByteStr, // string to map
  int cbMultiByte,       // number of bytes in string
  LPWSTR lpWideCharStr,  // wide-character buffer
  int cchWideChar        // size of buffer
);
int WideCharToMultiByte(
  UINT CodePage,            // code page
  DWORD dwFlags,            // performance and mapping flags
  LPCWSTR lpWideCharStr,    // wide-character string
  int cchWideChar,          // number of chars in string
  LPSTR lpMultiByteStr,     // buffer for new string
  int cbMultiByte,          // size of buffer
  LPCSTR lpDefaultChar,     // default for unmappable chars
  LPBOOL lpUsedDefaultChar  // set when default char used
);

    该函数的定义非常明了,使用也非常简单。以Unicode为中介可以实现GB2312与UTF-8的互相转换。用代码说话:

char  *psz   = "78好87";   //psz={37 38 BA C3 38 37 00}
char buf[1024], buf2[1024];

 

MultiByteToWideChar(CP_ACP, 0, psz, -1, (unsigned short *)buf, 1024);    //将ANSI字符串转换为Unicode,buf[]={37 00 38 00 7D 59 38 00 37 00 00 00}

 

WideCharToMultiByte (CP_UTF8, 0, (unsigned short *)buf, -1, buf2, 1024, NULL, NULL);    //将Unicode转换为utf8,buf2[]={37 38 E5 A5 BD 38 37 00}

 

MultiByteToWideChar(CP_UTF8, 0, buf2, -1, (unsigned short *)buf, 1024);    //将utf8转换为Unicode, buf[]={37 00 38 00 7D 59 38 00 37 00 00 00}

 

WideCharToMultiByte (CP_ACP, 0, (unsigned short *)buf, -1, buf2, 1024, NULL, NULL);    //将Unicode转换为ANSI, buf2[]={37 38 BA C3 38 37 00} 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值