- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
前谈过一篇关于Linux下面Unicode使用的文章。那个主要是针对多字节和宽字符的转换而谈的。今天说的有些类似,主要是windows下面关于字符编码转换和Linux下面的不同。
我移植的那部分程序中,有函数是用来实现UTF-8和GBK之间的转换的。其实其他很多不同类型的字符之间转换都可以用这种方法。
先说windows。因为windows下面没有函数可以实现这一功能,所以得自己写。思路很简单,就是利用之前讲过的那两个函数来实现,即:MultiByteToWideChar和WideCharToMultiByte来实现。先将其中一种编码(如UTF-8)利用MultiByteToWideChar
转换为宽字节,然后再利用WideCharToMultiByte转换为另一种编码(如GBK)。反过来也是一样的。
附加代码:utf-8转为gbk
#ifWIN32
boolUtf8ToGbk(constvoid*utf8Str,char*pStr)
{
if(utf8Str==NULL){returnfalse;
}
intnLen=0;
//获取转换到unicode编码后所需的字符空间长度;
nLen=::MultiByteToWideChar(CP_UTF8,0,(char*)utf8Str,-1,NULL,NULL);WCHAR*unicodeStr=newWCHAR[nLen+1]; //unicode字符串空间;
//转换到unicode编码;
nLen=::MultiByteToWideChar(CP_UTF8,0,(char*)utf8Str,-1,unicodeStr,nLen);if(!nLen){
delete[]unicodeStr;returnfalse;
}
// //
//获取转换到gbk编码后所需的字符空间长度;
nLen=::WideCharToMultiByte(CP_ACP,0,unicodeStr,-1,NULL,NULL,NULL,NULL);CHAR*gbkStr=newCHAR[nLen+1]; //unicode字符串空间;
//转换到gbk编码;
nLen=::WideCharToMultiByte(CP_ACP,0,unicodeStr,-1,gbkStr,nLen,NULL,NULL);if(!nLen){
delete[]gbkStr;returnfalse;
}
strcpy(pStr,gbkStr);delete[]gbkStr;
returntrue;
}
#endif
下面给出代码:
LONGUTF8ToGBK(constvoid*lpUTF8Str,string
LONGUTF8ToGBK(constvoid*lpUTF8Str,stringstr)
{
if(lpUTF8Str==NULL) return-1;
intnRetLen=0;
//获取转换到Unicode编码后所需要的字符空间长度
nRetLen=::MultiByteToWideChar(CP_UTF8,0,
(char*)lpUTF8Str,-1,NULL,NULL);
WCHAR*lpUnicodeStr=newWCHAR[nRetLen+1];
//为Unicode字符串空间
//转换到Unicode编码
nRetLen=::MultiByteToWideChar(CP_UTF8,0,
(char*)lpUTF8Str,-1,lpUnicodeStr,nRetLen);
if(!nRetLen)
{
delete[]lpUnicodeStr;return-1;
}
//获取转换到GBK编码后所需要的字符空间长度
nRetLen=::WideCharToMultiByte(CP_ACP,0,lpUnicodeStr,
-1,NULL,NULL,NULL,NULL);
CHAR*lpGBKStr=newCHAR[nRetLen+1];
nRetLen=::WideCharToMultiByte(CP_ACP,0,lpUnicodeStr,
-1,(char*)lpGBKStr,nRetLen,NULL,NULL);
//转换到GBK编码
if(!nRetLen)
{
delete[]lpUnicodeStr;delete[]lpGBKStr;return-2;
}
str=lpGBKStr;d
文档评论(0)