2008-12-17 79 views
2

我在RAD Studio 2009中遇到了一些问题。
如您所知,可以在MSVS中右键切换Unicode支持(右键单击solution-> properties-> character set = not set)。我需要在RAD Studio中找到这个功能,我知道它存在但不知道究竟在哪里。
这是唯一停止我在Socket Chat大学项目上的工作。
P.S.从CodeGear官方网站安装更新后出现问题。
是否可以关闭RAD Studio 2009中的Unicode支持?

+1

或许,如果你发布了关于“问题”的问题,有可能是一个解决方案即使在开启unicode支持的情况下也能正常工作。 – 2008-12-17 20:50:55

+0

我需要从编辑中获取字符串。
TMainForm-> IPEdit-> Text.c_str()。
我认为它必须是char *返回值,但它是wchar_t *。我需要将其转换为char *以使用套接字函数。任何想法如何做到这一点? – chester89 2008-12-17 20:58:10

回答

12

简短的回答:没有,没有这样的功能关闭的Unicode在RAD Studio 2009.

0

I`ve解决的问题是这样的:


    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; 

,但在我看来,可以去看另一种方式

1

是否可以关闭它?更好的问题是:你应该关掉它吗?答案是:NO。

设计应用程序的目的很远,以便在序列化(例如,在应用程序的套接字中)时正确发送Unicode字符,而不是在Unicode世界中设计非Unicode程序。即使是一个简单的项目,原则上也值得学习Unicode。

1

准确地说,您可以通过修改“TCHAR maps to char”的项目选项来定义您的C++ Builder应用程序,而不需要定义#UNICODE标志。

这意味着,SendMessage函数将调用SendMessageA等,以及TCHAR

但是,如果你使用任何VCL功能,不存在非Unicode等同于那些。现在VCL继承Unicode,并且不能改变。

Re:你的“解决方案” - 有一个更简单的方法。这既TCHAR = char或wchar_t的工作原理:

MessageBox(NULL, Form2->Edit1->Text.t_str(), _TEXT("It`s ok"), MB_OK); 
+0

_TEXT宏等的使用可以在那里使用,所以如果移动到Unicode,它不会像显式字符串那样可怕。 – 2009-01-13 15:20:57

3

您可以选择使用的UnicodeString :: t_str()方法要小心。如果您在为Ansi而不是Unicode编译的项目中调用它,则t_str()将更改UnicodeString的内部内容。这可能会产生意想不到的副作用,特别是对于来自控件的UnicodeString值。

3

切斯特 - 你不需要直接调用WideCharToMultiByte()。让RTL做的工作适合你:

AnsiString s = Form2->Edit1->Text; 
MessageBoxA(NULL, s.c_str(), "It`s ok", MB_OK); 
1

有一个更好的办法,我不喜欢这样写道:

MessageBox(NULL, Form2->Edit1->Text.w_str(), L"It`s ok", MB_OK);