//
/* 转化 CString成为 string 的代码*/
CString cstr;
size_t wc_size = 0;
size_t cc1=0;
wchar_t* w_str =cstr.GetBuffer();
char* char_str= new char[cstr.GetLength()+1];
wc_size = wcslen(w_str)+1;
wcstombs_s(&cc1, char_str, wc_size, w_str, _TRUNCATE);
string str(char_str);
这样我们就把 Cstring cstr 转化成为 string str
//
最近遇到了 在2005中转化CString和string问题,在网上找了好久也没有找到合适的解决方法, 最后是Guorui的代码帮了我很大的忙,现在总结一下,希望对以后的兄弟们能有帮助。
从 VC6.0 到 2003 再到 2005, 编译器越来越严格,但是这也意味着很多以前的 管用的代码也都淘汰了。(2008出来,没用过,不知道Mircosoft有没有更好的考虑我们这些 跨世纪和世纪之交的程序员感受。)
CString是mfc 提供的类, string是STL提供,两者之间的转化,在原有平台下本来不难,但是在2005下就很烦人了。
这里面核心的是将 “wchar_t” 类型 转化成“char”类型,涉及到 一些关于宽字符的问题。
/* 引自 http://www.manbu.net/Lib/Class9/Sub1/1/33.asp
宽字符
其实除了 上面的方法外,还可以尝试“WideCharToMultiByte”函数, 不过那就又涉及一些麻烦事了。(有机会再展开说吧)
/* 转化 CString成为 string 的代码*/
CString cstr;
size_t wc_size = 0;
size_t cc1=0;
wchar_t* w_str =cstr.GetBuffer();
char* char_str= new char[cstr.GetLength()+1];
wc_size = wcslen(w_str)+1;
wcstombs_s(&cc1, char_str, wc_size, w_str, _TRUNCATE);
string str(char_str);
这样我们就把 Cstring cstr 转化成为 string str
//
最近遇到了 在2005中转化CString和string问题,在网上找了好久也没有找到合适的解决方法, 最后是Guorui的代码帮了我很大的忙,现在总结一下,希望对以后的兄弟们能有帮助。
从 VC6.0 到 2003 再到 2005, 编译器越来越严格,但是这也意味着很多以前的 管用的代码也都淘汰了。(2008出来,没用过,不知道Mircosoft有没有更好的考虑我们这些 跨世纪和世纪之交的程序员感受。)
CString是mfc 提供的类, string是STL提供,两者之间的转化,在原有平台下本来不难,但是在2005下就很烦人了。
这里面核心的是将 “wchar_t” 类型 转化成“char”类型,涉及到 一些关于宽字符的问题。
/* 引自 http://www.manbu.net/Lib/Class9/Sub1/1/33.asp
宽字符
(1)Unicode或者宽字符都没有改变char数据类型在C中的定义。
(2)C中的宽字符基於wchar_t数据类型,它在几个头文件包括WCHAR.H中都有定义,如下:
typedef unsigned short wchar_t ;
因此,wchar_t数据类型与无符号短整数型相同,都是16位宽。
(3)要定义包含一个宽字符的变量,可使用下面的语句:
wchar_t c = 'A' ;
变量c是一个双字节值0x0041,是Unicode表示的字母A。(
然而,因为Intel微处理器从最小的字节开始储存多字节数值,该字节实际上是以0x41、0x00的顺序保存在记忆体中。如果检查Unicode文字的电脑储存应注意这一点。)
(4)可定义指向宽字串的指针:
wchar_t * p = L"Hello!" ;
注意紧接在第一个引号前面的大写字母L(代表「long」)。这将告诉编译器该字串按宽字符保存——即每个字符占用2个字节。通常,指针变量p要占用4个字节,而字串变量需要14个字节-每个字符需要2个字节,末尾的0还需要2个字节。
(5)可以用下面的语句定义宽字符数组:
static wchar_t a[] = L"Hello!" ;
该字串也需要14个字节的储存空间,sizeof (a) 将返回14。索引数组a可得到单独的字符。a[1] 的值是宽字符「e」,或者0x0065。第一个引号和L两个符号之间必须没有空格。L使编译器将字串存为每个字符2字节。
(6)可在单个字符文字前面使用L字首,来表示它们应解释为宽字符。如下所示:
wchar_t c = L'A' ;
但通常这是不必要的,C编译器会对该字符进行扩充,使它成为宽字符。
宽字符程序库函数
strlen函数的宽字符版是wcslen(
wide-character string length:宽字串长度),并且在STRING.H(
其中也说明了strlen)和WCHAR.H中均有说明。strlen函数说明如下:
size_t __cdecl strlen (const char *) ;
而wcslen函数则说明如下:
size_t __cdecl wcslen (const wchar_t *) ;
要得到宽字串的长度可以调用
wchar_t * pw = L"Hello!" ;
iLength = wcslen (pw) ;
函数将返回字串中的字符数6。
改成宽字节後,字串的字符长度不改变,只是字节长度改变了。
所有带有字串参数的C执行时期程序库函数都有宽字符版。例如,wprintf是printf的宽字符版。这些函数在WCHAR.H和含有标准函数说明的头文件中说明。
其实除了 上面的方法外,还可以尝试“WideCharToMultiByte”函数, 不过那就又涉及一些麻烦事了。(有机会再展开说吧)