我在使用 RAD Studio 2009 时遇到了一点问题。
如您所知,可以在 MSVS 中关闭 Unicode 支持(右键单击解决方案->属性->字符集=未设置)。我需要在 RAD Studio 中找到这个功能,我知道它存在但不知道具体在哪里。
这是唯一阻止我在 Socket Chat 大学项目上工作的事情。
PS 这个问题是在我从 CodeGear 官方网站安装更新后出现的。
7 回答
简短回答:不,RAD Studio 2009 中没有关闭 Unicode 的功能。
您必须小心使用 UnicodeString::t_str() 方法。如果在为 Ansi 而不是 Unicode 编译的项目中调用它,t_str() 会更改 UnicodeString 的内部内容。这可能会产生意想不到的副作用,尤其是对于来自控件的 UnicodeString 值。
chester - 你不需要直接调用 WideCharToMultiByte()。让 RTL 为您完成工作:
AnsiString s = Form2->Edit1->Text;
MessageBoxA(NULL, s.c_str(), "It`s ok", MB_OK);
是否可以关闭它?更好的问题是:你应该把它关掉吗?答案是:不。
设计应用程序以便在序列化时正确发送 Unicode 字符(例如,在应用程序的套接字中)比在 Unicode 世界中设计非 Unicode 程序要远得多。即使对于一个简单的项目,原则上也值得学习 Unicode。
准确地说,您可以通过修改“TCHAR maps to char”的项目选项来构建您的 C++ Builder 应用程序,而无需定义 #UNICODE 标志。
这意味着 SendMessage 将调用 SendMessageA 等,而 TCHAR
但是,如果您使用任何 VCL 函数,则没有非 unicode 等效项。VCL 现在是固有的 Unicode,并且无法更改。
回复:您的“解决方案”-有一种更简单的方法。它适用于 TCHAR = char 或 wchar_t:
MessageBox(NULL, Form2->Edit1->Text.t_str(), _TEXT("It`s ok"), MB_OK);
有一个更好的方法,我这样做:
MessageBox(NULL, Form2->Edit1->Text.w_str(), L"It`s ok", MB_OK);
我已经通过这种方式解决了这个问题:
wchar_t* str = Form2->Edit1->Text.w_str();
char* mystr = new char [Form2->Edit1->Text.Length() + 1];
WideCharToMultiByte(CP_ACP, 0, str, -1, mystr, Form2->Edit1->Text.Length() + 1, NULL, NULL);
MessageBox(NULL, mystr, "It`s ok", MB_OK);
delete []mystr;
但在我看来,还有另一种方式