【问题标题】:Is it possible to turn off Unicode support in RAD Studio 2009?是否可以在 RAD Studio 2009 中关闭 Unicode 支持?
【发布时间】:2008-12-17 20:46:21
【问题描述】:

我在使用 RAD Studio 2009 时遇到了一点问题。
如您所知,可以在 MSVS 中关闭 Unicode 支持(右键单击解决方案->属性->字符集=未设置)。我需要在 RAD Studio 中找到这个功能,我知道它存在但不知道具体在哪里。
这是唯一阻止我在 Socket Chat 大学项目上工作的事情。
附言在我从 CodeGear 官网安装更新后出现问题。

【问题讨论】:

  • 也许如果您发布了一个关于“问题”的问题,那么即使打开了 unicode 支持,也可能会有一个解决方案。
  • 我需要从编辑中获取字符串。
    TMainForm->IPEdit->Text.c_str()。
    我想一定是char*返回值,但它是wchar_t*。我需要将其转换为 char* 才能使用套接字函数。知道怎么做吗?

标签: delphi ide delphi-2009


【解决方案1】:

简短回答:不,RAD Studio 2009 中没有关闭 Unicode 的功能。

【讨论】:

    【解决方案2】:

    chester - 你不需要直接调用 WideCharToMultiByte()。让 RTL 为您完成工作:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 雷米,很高兴在这里见到你!欢迎来到 StackOverflow。这里的 Delphi 社区变得更加丰富了!
      【解决方案4】:

      可以关掉吗?更好的问题是:你应该把它关掉吗?答案是:没有。

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

      【讨论】:

        【解决方案5】:

        确切地说,您可以通过修改“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);
        

        【讨论】:

        • 在那里使用 _TEXT 宏等等,所以如果迁移到 Unicode,对于显式字符串来说就不会那么可怕了。
        【解决方案6】:

        有更好的办法,我是这样做的:

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

        【讨论】:

          【解决方案7】:

          我已经通过这种方式解决了这个问题:

          
              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;
          

          但在我看来,还有另一种方式

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-04-05
            • 1970-01-01
            • 2013-05-29
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-10-31
            相关资源
            最近更新 更多