关于string转换为wchar *

在做实验的时候发现的问题。
之前也是一直用的wsprintf函数的。由于要不直接就是全部都是文字要不就是数字
也就是
wsprintf(s,TEXT("2进制"));

int number;wsprintf(s,TEXT("2进制%d"),number);
的形式,所以没有遇到问题。
但是做实验的时候遇到要将字符串格式化后输出
用了这样的代码:
WCHAR s[60];
string sm="1d21我s";
wsprintf(s,TEXT("2进制:%s"),sm.c_str());
结果出现的结果就是乱码。
上网查了下,直接把%s改为%S就可以了
就是这样的代码:
WCHAR s[60];
string sm="1d21我s";
wsprintf(s,TEXT("2进制:%S"),sm.c_str());

(TEXT()是将字符串指针转换为LPCWSTR,LPCWSTR是Unicode字符串指针)

在wsprintf中

%s表示接受的字符转化为宽字符(WideChar)
%S表示接受的字符转化为多字节字符串(multibyte)
(这里是我个人目前的理解,不保证说的正确)

关于sprintf(http://topic.csdn.net/t/20010910/17/280755.html
sprintf用于短字符
swprintf用于宽字符
wsprintf是windows版的格式化函数,可用于短字符和宽字符

这里涉及到字符编码的问题。
短字符,就是用8bit来表示的字符,典型的是ASCII码
宽字符,就是用16bit表示的字符,典型的是UNICODE.

qq上问了人家。说是最好是用标准的函数MultiByteToWideChar和WideCharToMultiByte
2个在网上找的函数:(http://www.cppblog.com/sunraiing9/archive/2007/03/21/20281.html
BOOL MByteToWChar(LPCSTR lpcszStr, LPWSTR lpwszStr, DWORD dwSize)
  {
    // Get the required size of the buffer that receives the Unicode
    // string.
    DWORD dwMinSize;
    dwMinSize = MultiByteToWideChar (CP_ACP, 0, lpcszStr, -1, NULL, 0);
 
    if(dwSize < dwMinSize)
    {
     return FALSE;
    }
 
   
    // Convert headers from ASCII to Unicode.
    MultiByteToWideChar (CP_ACP, 0, lpcszStr, -1, lpwszStr, dwMinSize); 
    return TRUE;

  }
  BOOL WCharToMByte(LPCWSTR lpcwszStr, LPSTR lpszStr, DWORD dwSize)
  {
   DWORD dwMinSize;
   dwMinSize = WideCharToMultiByte(CP_OEMCP,NULL,lpcwszStr,-1,NULL,0,NULL,FALSE);
   if(dwSize < dwMinSize)
   {
    return FALSE;
   }
   WideCharToMultiByte(CP_OEMCP,NULL,lpcwszStr,-1,lpszStr,dwSize,NULL,FALSE);
   return TRUE;
  }
使用示例如下:
  wchar_t wText[10] = {L"函数示例"};
  char sText[20]= {0};
  WCharToMByte(wText,sText,sizeof(sText)/sizeof(sText[0]));
  MByteToWChar(sText,wText,sizeof(wText)/sizeof(wText[0]));

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值