在做实验的时候发现的问题。
之前也是一直用的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]));