stirng、wstring,char和wchar之间的转换

一.ANSI和UNICODE

   1ANSI字符和Unicode字符
   ANSI字符类型为CHAR指向字符串的指针PSTR(LPSTR),指向一个常数字符串的指针PCSTR(LPCSTR)

   对应的Windows定义的Unicode字符类型为WCHARtypedef WCHAR wchar_t ,指向Unicode字符串的指针PWSTR ,指向一个常数Unicode字符串的指针PCWSTR 

   ANSI “ANSI” 
   Unicode 
L“UNICODE” 
   ANSI/Unicode
 T(“string”)_TEXT(“string”)

   2ANSI字符和Unicode字符串的操作

   双字节(DBCS)字符集中,字符串的每个字符可以包含一个或两个字节。如果只是调用strlen()函数,那么你就无法知道字符串到底有多少个字符,它只能告诉你到达结尾的0之前有多少个字节。

   标准c中的strcpy,strchr,strcat等只能用于ANSI字符串,不能正确处理Unicode字符串,因此也提供了一组补充函数,功能等价,但用于Unicode码。我们来看看string .h字符串头文件中是怎样处理char*和wchar_t*两个字        符串版本的:

char *strcat(char*,const char*);
wchar_t *wcschr(wchat_t*,const wchar_t *)
   类似的还有strchr/wcschr,strcmp/wcscmp,strlen/wcslen etc.
   ANSI 操作函数以str开头 strcpy 
   Unicode 
操作函数以wcs开头 wcscpy  
   MBCS 
操作函数以_mbs开头 _mbscpy 
   ANSI/Unicode 
操作函数以_tcs开头 _tcscpyC运行期库) 
   ANSI/Unicode 
操作函数以lstr开头 lstrcpyWindows函数)

   3.函数的使用

   有的人爱用strcpy等标准ANSI函数,有的人爱用_tXXXX函数,有必要把来龙去脉搞清楚。 为了搞清这些函数,就必须理请几种字符类型的写法。char就不用说了,先说一些wchar_t。wchar_t是Unicode字符的数据类型,它实    际定义在<string.h>里:
typedef unsigned short wchar_t;
   不能使用类似strcpy这样的ANSI C字符串函数来处理wchar_t字符串,必须使用wcs前缀的函数,例如wcscpy。为了让编译器识别Unicode字符串,必须以在前面加一个“L”,例如:
wchar_t *szTest=L"This is a Unicode string."
wchar_t是Unicode字符的数据类型,它实际定义在<string.h>里:
typedef unsigned short wchar_t;
   下面在看看TCHAR。如果你希望同时为ANSI和Unicode编译的源代码,那就要include TChar.h。TCHAR是定义在其中的一个宏,它视你是否定义了_UNICODE宏而定义成char或者wchar_t。如果你使用了TCHAR,那么就不应    该使用ANSI的strXXX函数或者Unicode的wcsXXX函数了,而必须使用TChar.h中定义的_tcsXXX函数。另外,为了解决刚才提到带“L”的问题,TChar.h中定义了一个宏:“_TEXT”。
   以strcpy函数为例子,总结一下:
   如果你想使用ANSI字符串,那么请使用这一套写法:
char szString[100];
strcpy(szString,"test");
   如果你想使用Unicode字符串,那么请使用这一套:
wchar_t szString[100];
wcscpyszString,L"test");
.如果你想通过定义_UNICODE宏,而编译ANSI或者Unicode字符串代码:
TCHAR szString[100];
_tcscpy(szString,_TEXT("test"));

   4.常用转换函数

//char*转化为wchar*
void charTowchar(const char *chr, wchar_t *wchar, int size)  
{     
    MultiByteToWideChar( CP_ACP, 0, chr,  
        strlen(chr)+1, wchar, size/sizeof(wchar[0]) );  
}  

//wchar*转化为char*
void wcharTochar(const wchar_t *wchar, char *chr, int length)  
{  
    WideCharToMultiByte( CP_ACP, 0, wchar, -1,  
        chr, length, NULL, NULL );  
}  

//string转化为wstring
wstring string2wstring(string str)
{
	wstring result;
	//获取缓冲区大小,并申请空间,缓冲区大小按字符计算
	int len = MultiByteToWideChar(CP_ACP, 0, str.c_str(), str.size(), NULL, 0);
	TCHAR* buffer = new TCHAR[len + 1];
	//多字节编码转换成宽字节编码
	MultiByteToWideChar(CP_ACP, 0, str.c_str(), str.size(), buffer, len);
	buffer[len] = '\0';				//添加字符串结尾
	//删除缓冲区并返回值
	result.append(buffer);
	delete[] buffer;
	return result;
}

//wstring转化为string
string wstring2string(wstring wstr)
{
	string result;
	//获取缓冲区大小,并申请空间,缓冲区大小事按字节计算的
	int len = WideCharToMultiByte(CP_ACP, 0, wstr.c_str(), wstr.size(), NULL, 0, NULL, NULL);
	char* buffer = new char[len + 1];
	//宽字节编码转换成多字节编码
	WideCharToMultiByte(CP_ACP, 0, wstr.c_str(), wstr.size(), buffer, len, NULL, NULL);
	buffer[len] = '\0';
	//删除缓冲区并返回值
	result.append(buffer);
	delete[] buffer;
	return result;
}

    5.string转换为char*有3中方法:

1.data
如:

<span style="white-space:pre">	</span>stringstr="abc";
<span style="white-space:pre">	</span>char*p=(char*)str.data();

2.c_str

如:

<span style="white-space:pre">	</span>stringstr="gdfd";
   <span style="white-space:pre">	</span>char*p=str.c_str();

3.copy

如:

<span style="color:#330033;">string str="hello";
char p[40];
str.copy(p,5,0); //这里5,代表复制几个字符,0代表复制的位置
*(p+5)='\0'; //要手动加上结束符</span><span style="color:#ff00ff;">

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值