[免责声明]
所有“代码示例”均来自我的脑海,并未实际编译。
String 类型只是根据UNICODE 定义选择AnsiString 或UnicodeString 类的宏。
之前,UNICODE 没有默认定义,所以使用了char,选择了AnsiString 类。今天UNICODE 是默认定义的,所以使用wchar_t,选择UnicodeString 类。这非常方便,因为 Windows API 现在默认为 Unicode。
还有其他几种类型,如WideString、UTF8String 等。它们都有大致相同的接口(因此可以互换)。因此.c_str() 根据所选的String 类返回不同的类型。
要迁移,您通常只需在所有常量字符串前面放置一个L,例如L"My unicode message"
应该只在极少数情况下特别需要 8 位 char。对于这些情况,您可以使用AnsiString() 进行转换。
String Foo = "This is Unicode";
Bar(AnsiString(Foo).c_str()); // AnsiString converts Foo into an 8bit char pointer.
Baz(Foo.c_str()); // Foo returns a wchar_t pointer.
Windows API 通常每个函数有两个版本,xxxxA 用于 Ansi 和 xxxxW 用于宽版本。如果省略结尾 A 或 W,Windows 将根据 UNICODE 定义使用正确的版本。 W 版本要求您使用 L"My string",而 A 版本则不需要。 Microsoft 使用TEXT 宏:TEXT("Auto converted") 解决了这个问题。 TEXT 宏将根据UNICODE 定义将常量字符串转换为ansi 或wide。通过选择正确的 API 函数版本,此行将在 UNICODE 已定义或未定义的情况下正常工作。
MessageBox(TEXT("Auto converted string"),TEXT("TEXT MACRO"),0);
您可以通过将 A 或 W 附加到 API 函数名称来强制 Windows 使用 Ansi 或 Wide 版本。
MessageBoxA("This is the ansi version","MessageBoxA",0);
MessageBoxW(L"This is the wide version",L"MessageBoxW",0);
如果可能,我建议您将项目迁移为仅使用String,并在绝对需要时转换为AnsiString(例如调用仅接受8 位char 的库函数)。 char 在你的项目中默认应该是wchar_t(参见“project->Options->C++ Shared Options->_TCHAR maps to”)