现在的位置: 首页 > 综合 > 正文

VC多字节字符串和宽字节字符串转换

2013年10月12日 ⁄ 综合 ⁄ 共 1506字 ⁄ 字号 评论关闭

在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

宽字节字符串有它自己的一系列字符串处理函数,和多字节字符串不一样,使用的时候要注意。

抱歉!评论已关闭.