所谓的短字符,就是用8bit来表示的字符,典型的应用是ASCII码.而宽字符,顾名思义,就是用16bit表示的字符,典型的有UNICODE.
W版本和A版本的API
Windows 支持 Unicode 和 ASCII 编码的字符。Windows 系统 API 凡是以字符串作为参数的 很多具有 W 和 A 两个版本以实现两种不同编码的字符处理。
以MessageBox为例:在程序进行编译和连接时,如果程序在UNICODE环境下,会使用MessageBoxW, 否则使用 MessageBoxA。
Unicode与ASCII的转换
Windows 专门提供了若干个 API 来实现对字符编码的转换工作。WideCharToMultiByte、 MultiByteToWideChar、UnicodeToBytes函数可以完成这些工作。
WideCharToMultiByte 函数将 Unicode 字符串转换为多字节字符串,以适应 A 版本的 API;
MultiByteToWideChar函数将多字节字符串转换为了Unicode字符串,以适应W版本 的 API 的参数形式要求。
eg:
#include <Windows.h>
#include <iostream>
using namespace std;
//将单字节char*转化为宽字节wchar_t*
wchar_t* AnsiToUnicode( const char* szStr )
{
int nLen = MultiByteToWideChar( CP_ACP, 0, szStr, -1, NULL, 0 );
if (nLen == 0)
{
return NULL;
}
cout<< "AnsiToUnicode nlen = " << nLen << endl;
wchar_t* pResult = new wchar_t[nLen];
MultiByteToWideChar( CP_ACP, 0, szStr, -1, pResult, nLen );
return pResult;
}
//将宽字节wchar_t*转化为单字节char*
char* UnicodeToAnsi( const wchar_t* szStr )
{
int nLen = WideCharToMultiByte( CP_ACP, 0, szStr, -1, NULL, 0, NULL, NULL );
if (nLen == 0)
{
return NULL;
}
cout<< "UnicodeToAnsi nlen = " << nLen << endl;
char* pResult = new char[nLen];
WideCharToMultiByte( CP_ACP, 0, szStr, -1, pResult, nLen, NULL, NULL );
return pResult;
}
int _tmain(int argc, _TCHAR* argv[])
{
LPWSTR w_str =L"Good";
LPSTR s_str = "Hello,world!";
LPWSTR w_str2 =NULL;
LPSTR s_str2 =NULL;
s_str2 = UnicodeToAnsi(w_str);
w_str2 = AnsiToUnicode(s_str);
printf("s_str2 = %s\n",s_str2);
wprintf(L"w_str2 = %s\n",w_str2);
return 0;
}