MFC CString 是宽字符字符串吗

Is MFC CString a wide char string

我正在使用 CStrings(控制台应用程序)开发一个 win32 项目,当我想传递给一个函数(例如 strtok_s)一个 LPSTR 指针时,我注意到了一些奇怪的事情来自 CString 和方法 GetBuffer(),最后一个没有给我一个 LPSTR,而是给了我一个 LPWSTR(指向宽字符串的指针)... CString 应该存储 8 位字符,不是吗?

我不得不在某些情况下使用 CStringA 例如能够使用方法 Find() 因为使用 CString 我的输入字符串必须是一个宽一。但是在其他另一个项目(窗口程序)中,我没有这个问题,我怀疑 headers (当我使用 afxstr.h "Find" 与普通字符串一起工作时,但不是afxcoll.h...)

通常我和 std::string 一起工作,这就是我迷路的原因。

CString 是一个 typdef,声明为 (afxstr.h):

typedef ATL::CStringT< TCHAR, StrTraitMFC< TCHAR > > CString;
// Or, when using the MFC DLL
typedef ATL::CStringT< TCHAR, StrTraitMFC_DLL< TCHAR > > CString;

根据 TCHAR 是什么,CString 存储 ANSI (MBCS) 或 Unicode 字符串。还有 CStringT 模板的显式实例化:CStringWCStringA.

两种类型都有一个转换构造函数,采用指向相应其他字符编码的常量指针。换句话说:您可以从 ANSI (MBCS) 字符串构造 CStringW,以及从 UTF-16LE 编码的 Unicode 字符串构造 CStringA

如果您需要明确说明字符编码,请使用 CStringWCStringA


CString 的完整文档可在 CStringT Class 获得。