在VC编程中,wchar_t表示unicode字符类型,一个字符占两个字节,char则是ascii码类型,一个字符占一个字节。两者分别用在Unicode和ANSI编程环境下。下面是一组测试程序以及两者之间的转换程序,主要用到wcstombs以及mbstowcs函数。
#include<iostream>
#include<string>
#include<Windows.h>
using namespace std;
/**
* LPWSTR 与 wchar_t* 等价 (wchar_t是C/C++的字符数据类型,是一种扩展的字符存储方式)
* LP (long pointer)
* W 宽字节
* STR 字符串
*/
void lpwstr()
{
//需要包含下面两行,不然不能wcout字符串
locale loc("chs");
wcout.imbue( loc );
//
LPWSTR lps1 = L"直接赋值";
wcout << lps1 << endl;
//
wchar_t* t1 = L"扩展字符串赋值";
lps1 = t1;
wcout << lps1 << endl;
//
LPWSTR lps2 = TEXT("宽字符转多字节");
wcout << lps2 << " len=" << lstrlen(lps2) << endl;
//convert from wchar_t* to char*
int size = lstrlen(lps2)*2 + 1;
char *t2 = new char[size];
//不加这句会乱码(多字节有多种,而宽字节只有unicode)
setlocale(LC_ALL, "Chinese-simplified");
wcstombs(t2, lps2, size);
cout << t2 << " len=" << strlen(t2) << endl;
delete t2;
//convert from char* to wchar_t*
char *t3 = "多字节转宽字节";
size = strlen(t3);
wchar_t *t4 = new wchar_t[size];
mbstowcs(t4, t3, size);
wcout << t4 << endl;
delete t4;
}
/**
* LPSTR 与 char* 等价
* LP (long pointer)
* STR 字符串
*/
void lpstr()
{
LPSTR ls1 = "直接赋值";
cout << ls1 << endl;
char *t1 = "字符串赋值";
LPSTR ls2 = t1;
if(strcmp(ls2, t1) == 0)
{
char *t2 = ls2;
cout << t2 << endl;
}
}
/**
* LPCSTR 与 const char* 等价
* LP (long pointer)
* C const
* STR 字符串
*/
void lpcstr()
{
LPCSTR ls1 = "直接赋值";
cout << ls1 << endl;
char *t1 = "字符串赋值";
LPCSTR ls2 = t1;
if(strcmp(ls2, t1) == 0)
{
const char *t2 = ls2;
cout << t2 << endl;
}
}
int main()
{
//char *
lpstr();
//wchar_t *
lpwstr();
return 0;
}
在是否定义了UNICODE宏下LPTSTR的含义又不同
#ifdef UNICODE
typedef LPWSTR PTSTR, LPTSTR;
typedef LPCWSTR PCTSTR, LPCTSTR;
#else
typedef LPSTR PTSTR, LPTSTR, PUTSTR, LPUTSTR;
typedef LPCSTR PCTSTR, LPCTSTR, PCUTSTR, LPCUTSTR;
#endif
宽字节字符串有它自己的一系列字符串处理函数,和多字节字符串不一样,使用的时候要注意。