CString中的字符编码问题

CString是一个封装好了的类,封装时必须考虑兼容问题,CString在多字节(ansi)环境下为CStringA,在Unicode环境下为CStringW,所以CString等价于(也就是CString封装类中实际使用的类型)LPCTSTR ,LP表示指针,C表示常量不是很重要,重要的是T这是个宏,表达的意思类似于模板参数,LPCTSTR 是一个typedef声明的一个类型,如果定义了unicode编码,宏T也表示宽字符(W表示宽字符),即一个字符占2字节。

char是ansi编码占用一个字节,只能表示256个字符,wchar_t是unicode编码,占用4字节或8字节,根据C++库决定,TCHAR的类型根据所在平台的默认编码集而定,在unicode平台则是char,在ansi(多字节编码)平台则是wchar_t,所以如果没定义unicode,使用多字节(ansi)编码 CString = LPCTSTR =const char*;如果定义了unicode, CString=LPCTSTR=LPCWSTR = const w_char*(都是宽字符);

多字节编码环境下:

CStringA strA = "汉字啊";
CString str;
str = strA;  //注意这里应调用赋值操作符重载函数,不能直接CString str = strA,因为会调用赋值构造函数而出错
CString str2 = _T("也是汉字啊");
CStringA strA2;
strA2 = str2;

Unicode编码环境下

CStringW strW = L"汉字啊";
CString str;
str = strW;
CString str2 = "也是汉字啊";
CStringW strW2;
strW2 = str2;

当不知道编码环境:

CString str = “汉字”;

const char* c_str = str;

CString str = _T("汉字啊");
const wchar_t* c_str = str; 

当工程是Unicode编码时,_T将括号内的字符串以Unicode方式保存;当工程是多字节编码时,_T将括号内的字符串以ANSI方式保存。

关键字“L”,则是不管编码环境是什么,都是将其后面的字符串以Unicode方式保存

报错:

const char*类型的实参与LPCTSTR类型的形参不兼容 MFC

MFC 使用了宽字符编码(Unicode)的字符串类型 LPCTSTR,而 "const char *" 类型是窄字符编码(ASCII)的字符串类型。

为了解决这个问题,可以进行字符串类型的转换。有几种方法可以处理这种类型不兼容的问题:

使用窄字符编码字符串: 如果你的项目中使用的是窄字符编码,就可以将 "const char *" 类型的字符串转换为窄字符编码。可以使用 CStringA 类或 std::string 类等来存储和操作窄字符编码的字符串。头文件atlstr.h

使用宽字符编码字符串: 如果你的项目中使用的是宽字符编码,就需要将 "const char *" 类型的字符串转换为宽字符编码。可以使用 CStringW 类或 std::wstring 类等来存储和操作宽字符编码的字符串。头文件atlstr.h

执行字符串编码转换: 如果你需要在窄字符编码和宽字符编码之间进行转换,可以使用字符mf串编码转换函数,例如 MultiByteToWideChar 和 WideCharToMultiByte,或者使用相应的库或函数进行字符串编码转换,如 CStringA::SetString 和 CStringW::SetString。头文件windows.h

也可以通过更改字符集解决。项目->属性->高级->高级属性->字符集,将Unicode字符集改为多字节字符集即可

为了满足程序代码的国际化需要,业界推出了Unicode标准,它提供了一种简单和一致的表达字符串的方法,所有字符串中的字节都是16位的值,其数量也可以满足差不多世界上所有书面语言字符的编码需求,开发程序时使用Unicode(类型为wchar_t)是一种被鼓励的做法。
LPWSTR与LPCWSTR由此产生,它们的含义类似于LPSTR与LPCSTR,只是字符数据时16位的wchar_t而不是char.
ANSI操作函数以str开头,如strcpy(), strcat(), strlen();
Unicode操作函数以wcs开头,如wcscpy, wcscpy(), wcslen();