我继承了一个旧的 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/