【问题标题】:AnsiString as default for type string in Embarcadero C++ Builder?AnsiString 作为 Embarcadero C++ Builder 中类型字符串的默认值?
【发布时间】:2015-06-24 03:28:12
【问题描述】:

我继承了一个旧的 Borland C++ Builder 应用程序,现在我必须将它迁移到一个新的开发工具。建议的方法是使用 Embarcadero C++ Builder,从我最初的测试来看,这似乎是一个相当平稳的过渡。

不过,我确实有一个问题,我希望有一个简单的解决方案:

应用程序解析大量文本文件。这些文件都是基于 ANSI 的,并且永远不会改变,所以它是 ANSI 输入和 ANSI 输出。我遇到的主要问题是,在 Embarcadero C++ 中,string 类型现在是 UnicodeString 而不是 AnsiString(就像在 Borland C++ Builder 中一样)。

在此应用程序中使用 Unicode 不是一个选项 - 它使用的文件是 ANSI 格式的。修改代码以使用AnsiString(和类似的)是可行的,但我宁愿不这样做,因为它使用了很多TStringList(和类似的)构造。

所以我的问题是:是否有设置或编译器选项或其他东西可以用来告诉 Embarcadero 使用 System.AnsiString 作为 string 的定义而不是 System.UnicodeString

这可能是一个远景,但 RAD Studio XE(这是我借来进行一些测试的旧版本)文档说“默认情况下,类型 string现在是 Unicode 字符串”,这意味着可以更改。然而,当前版本 (XE8) 的文档中对此进行了重新表述,所以...

【问题讨论】:

  • 为此目的使用UnicodeString 没有任何问题。 UnicodeStringAnsiString 都是模板AnsiStringT 的特化,其中模板参数是代码页。

标签: c++ c++builder unicode-string ansistring


【解决方案1】:

我可能有坏消息。他们总是谈论迁移,而不是快速修复。

http://docwiki.embarcadero.com/RADStudio/XE3/en/Enabling_Applications_for_Unicode http://docwiki.embarcadero.com/RADStudio/XE3/en/Enabling_C%2B%2B_Applications_for_Unicode

嗯...我讨厌 Borland 的 Strings。到底是谁想出了从 1 开始编号而不是从 0 开始的编号?!

【讨论】:

  • Delphi 字符串是 1 索引的(除了在移动平台上,默认情况下它们是 0 索引,但是有一个 Dephi 编译器指令可以改变它)。 RTL/VCL/FMX 框架是用 Delphi 编写的,而不是用 C++ 编写的。 C++ System::AnsiStringSystem::UnicodeString 类只是 Delphi 原生字符串类型的兼容包装器,因此它们必须使用相同的索引。
【解决方案2】:

我继承了一个旧的 Borland C++ Builder 应用程序,现在我必须将它迁移到一个新的开发工具。建议的方法是使用 Embarcadero C++ Builder

是的。它们实际上是同一种产品。 Borland 创建了一家名为 CodeGear 的子公司来管理其开发工具(Delphi、C++Builder 等),然后 Embarcadero 后来收购了 CodeGear。

我遇到的主要问题是,在 Embarcadero C++ 中,类型字符串现在是 UnicodeString 而不是 AnsiString(就像在 Borland C++ Builder 中一样)。

string(小写的 s)指的是 STL 的 std::string 类,它仍然是基于 char 的。您正在考虑 C++Builder 的 System::String 别名,它现在映射到 System::UnicodeString 而不是 System::AnsiString(该更改是在 C++Builder 2009 中进行的,当时引入了 UnicodeString)。但是AnsiString仍然存在,可以直接使用。

在这个应用程序中使用 Unicode 不是一个选项 - 它使用的文件是 ANSI 格式的。

那么不要使用UnicodeString 来处理它们。继续改用AnsiString

修改代码以使用 AnsiString(和类似的)是可行的,但我宁愿不这样做,因为它使用了很多 TStringList(和类似的)构造。

另一方面,这将是一个问题,是的。大多数 RTL 现在只支持UnicodeString。所以使用TStringList 的代码必须重写,例如使用TList<AnsiString>std::vector<AnsiString> 代替(除非代码使用TStringList::(Comma|Delimited)Text 属性,在这种情况下你有更大的重写)。但是,对于 AnsiString 解析代码,许多基于 AnsiString 的旧 RTL 函数已移至单独的 System.AnsiStrings 单元,因此您可以将 #include <System.AnsiStrings.hpp> 添加到代码中以访问它们。

所以我的问题是:是否有设置或编译器选项或其他东西可以用来告诉 Embarcadero 使用 System.AnsiString 作为字符串的定义而不是 System.UnicodeString?

没有。如果您考虑一下,这将是他们实施的一项重大任务。 RTL/VCL/FMX 框架的多个副本,每个支持的操作系统平台有 2 个。许多内部代码必须经过 IFDEF 处理才能处理 Ansi/Unicode 处理逻辑之间的差异。所以对他们来说并不是真正可行或具有成本效益(此时为时已晚,特别是考虑到移动操作系统平台不支持AnsiString - 尽管有一个可用于重新启用它的第 3 方补丁)。

这可能是一个长镜头,但 RAD Studio XE(这是我借来进行一些测试的旧版本)文档说“默认情况下,类型字符串现在是 Unicode 字符串”,这意味着这是可以改变的。

不,它不能被改变。 RTL/VCL/FMX 框架现在是 Unicode。但这并不要求您的代码也必须是 Unicode。仅在您需要直接与 RTL/VCL/FMX 交互的地方。您的其余代码可以根据需要继续使用AnsiString(甚至std::string)。

【讨论】:

  • 不是我希望的快速解决方案,但我知道这是一个长期的目标。一个非常好的和广泛的答案!我现在更好地理解了这个问题,并且有足够的线索相信我可以在没有太多工作的情况下解决这个问题。所以谢谢你,雷米!
【解决方案3】:

AnsiString-s 可以轻松转换为UnicodeString-s。这就是我处理转换的方式。旧 C++Builder 2007 代码:

void __fastcall TFormVidya::lbEntData(TWinControl *Control, int Index, AnsiString &Data)
{
    if(FEntNameSto) {
        char *pc;
        int len=FEntNameSto->PeekValue(Index,&pc);
        Data.printf("DB %.*s",len,pc);
    } else Data.sprintf("MOCK %d!",Index);
}

转换为 C++Builder XE2:

void __fastcall TFormVidya::lbEntData(TWinControl *Control, int Index, UnicodeString &Data)
{
    if(FEntNameSto) {
        char *pc;
        int len=FEntNameSto->PeekValue(Index,&pc);
        AnsiString astr;
        astr.printf("DB %.*s",len,pc);
        Data=astr;
    } else Data.sprintf(L"MOCK %d!",Index);
}

本质是将 AnsiString 分配给 UnicodeStringData=astr;

另外,帮助页面 ms-help://embarcadero.rs_xe2/libraries/System.UnicodeString.html(上面写着“默认情况下,声明为 String 类型的变量是 UnicodeString。” ),还说“尽管它的名字,UnicodeString 可以表示 ANSI 字符集字符串和 Unicode 字符串。”,但我无法使用它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-08
    • 2020-04-12
    • 2021-12-17
    • 1970-01-01
    • 2012-12-29
    • 2023-03-18
    • 1970-01-01
    相关资源
    最近更新 更多