注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Mihooke's blog

IT之恋

 
 
 

日志

 
 

wchar_t *转char *  

2015-05-22 23:18:37|  分类: C++ |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

/*这里提供一个方法*/

bool wchar2char(const wchar_t *wstr,std::string &outStr)

{

 if (wstr == NULL)

  return false;

 int wstrlen = wcslen(wstr);

 int templen = WideCharToMultiByte(CP_ACP, 0, wstr, -1, NULL, 0, NULL, NULL);

 char *tempstr = new char[templen+1];

 WideCharToMultiByte(CP_ACP, 0, wstr, -1,

  tempstr, templen, NULL, NULL);

 outStr = tempstr;

 delete tempstr;

}

下面是WideCharToMultiByte函数的参数含义:

CodePage: 指定要转换成的字符集代码页,可选的值有:

CP_ACP 当前系统ANSI代码页
CP_MACCP 当前系统Macintosh代码页
CP_OEMCP 当前系统OEM代码页,一种原始设备制造商硬件扫描码
CP_SYMBOL Symbol代码页,用于Windows 2000及以后版本,我不明白是什么
CP_THREAD_ACP 当前线程ANSI代码页,用于Windows 2000及以后版本,我不明白是什么
CP_UTF7 UTF-7,设置此值时lpDefaultCharlpUsedDefaultChar都必须为NULL
CP_UTF8 UTF-8,设置此值时lpDefaultCharlpUsedDefaultChar都必须为NULL

我想最常用的应该是CP_ACPCP_UTF8了,前者将宽字符转换为ANSI,后者转换为UTF8

dwFlags: 指定如何处理没有转换的字符, 但不设此参数函数会运行的更快一些,我都是把它设为0。 可设的值如下表所示:
WC_NO_BEST_FIT_CHARS 把不能直接转换成相应多字节字符的Unicode字符转换成lpDefaultChar指定的默认字符。也就是说,如果把Unicode转换成多字节字符,然后再转换回来,你并不一定得到相同的Unicode字符,因为这期间可能使用了默认字符。此选项可以单独使用,也可以和其他选项一起使用。
WC_COMPOSITECHECK 把合成字符转换成预制的字符。它可以与后三个选项中的任何一个组合使用,如果没有与他们中的任何一个组合,则与选项WC_SEPCHARS相同。
WC_ERR_INVALID_CHARS 此选项会致使函数遇到无效字符时失败返回,并且GetLastError会返回错误码ERROR_NO_UNICODE_TRANSLATION。否则函数会自动丢弃非法字符。此选项只能用于UTF8

WC_DISCARDNS 转换时丢弃不占空间的字符,与WC_COMPOSITECHECK一起使用
WC_SEPCHARS 转换时产生单独的字符,此是默认转换选项,与WC_COMPOSITECHECK一起使用
WC_DEFAULTCHAR 转换时使用默认字符代替例外的字符,(最常见的如’?’),与WC_COMPOSITECHECK一起使用。

当指定WC_COMPOSITECHECK时,函数会将合成字符转换成预制字符。合成字符由一个基字符和一个不占空间的字符(如欧洲国家及汉语拼音的音标)组成,每一个都有不同的字符值。预制字符有一个用于表示基字符和不占空间字符的合成体的单一的字符值。
当指定WC_COMPOSITECHECK选项时,也可以使用上表列出的最后3个选项来定制预制字符的转换规则。这些选项决定了函数在遇到宽字符串的合成字符没有对应的预制字符时的行为,他们与WC_COMPOSITECHECK一起使用,如果都没有指定,函数默认WC_SEPCHARS

对于下列代码页,dwFlags必须为0,否则函数返回错误码ERROR_INVALID_FLAGS
50220 50221 50222 50225 50227 50229 52936 54936 5700257011 65000(UTF7) 42(Symbol)
对于UTF8dwFlags必须为0WC_ERR_INVALID_CHARS,否则函数都将失败返回并设置错误码ERROR_INVALID_FLAGS,你可以调用GetLastError获得。

lpWideCharStr: 待转换的宽字符串。

cchWideChar: 待转换宽字符串的长度,-1表示转换到字符串结尾。

lpMultiByteStr: 接收转换后输出新串的缓冲区。

cbMultiByte: 输出缓冲区大小,如果为0lpMultiByteStr将被忽略,函数将返回所需缓冲区大小而不使用lpMultiByteStr

lpDefaultChar: 指向字符的指针, 在指定编码里找不到相应字符时使用此字符作为默认字符代替。 如果为NULL则使用系统默认字符。对于要求此参数为NULLdwFlags而使用此参数,函数将失败返回并设置错误码ERROR_INVALID_PARAMETER

lpUsedDefaultChar:开关变量的指针,用以表明是否使用过默认字符。对于要求此参数为NULLdwFlags而使用此参数,函数将失败返回并设置错误码ERROR_INVALID_PARAMETERlpDefaultCharlpUsedDefaultChar都设为NULL,函数会更快一些。

返回值: 如果函数成功,且cbMultiByte0,返回写入lpMultiByteStr的字节数(包括字符串结尾的null)cbMultiByte0,则返回转换所需

字节数。函数失败,返回0

 

  评论这张
 
阅读(55)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017