我继承了一个旧的 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)的文档中重新表述了这一点,所以......

最佳答案



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


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



然后不要使用 UnicodeString 来处理它们。继续使用 AnsiString 代替。



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



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



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

关于c++ - AnsiString 作为 Embarcadero C++ Builder 中类型字符串的默认值?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29696487/

10-10 06:14