Boi*_*ise 3 c++ c++builder unicode-string ansistring
我继承了一个旧的Borland C++ Builder应用程序,现在我必须迁移到一个新的开发工具.建议的方法是使用Embarcadero C++ Builder,从我最初的测试看,它似乎是一个相当平滑的过渡.
但我有一个问题,我希望有一个简单的解决方案:
该应用程序解析大量的文本文件.这些文件都是基于ANSI的,并且永远不会改变,因此它是ANSI输入和ANSI输出.我string遇到的主要问题是,使用Embarcadero C++,类型现在是一个UnicodeString而不是AnsiString(就像在Borland C++ Builder中一样).
在此应用程序中使用Unicode不是一个选项 - 它使用的文件是ANSI格式的.修改要使用的代码AnsiString(和类似的代码)是可行的,但我不愿意,因为它使用了很多TStringList(和类似的)构造.
所以我的问题是:是否有一个设置或编译器选项或者我可以用来告诉Embarcadero System.AnsiString用作定义string而不是System.UnicodeString?
这可能是一个长镜头,但是RAD Studio XE(我借用它来做一些测试的旧版本)文档说" 默认情况下,类型string现在是一个Unicode字符串",这意味着这可以是改变.然而,这在当前版本(XE8)的文档中被重新描述,所以......
我继承了一个旧的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框架的多个副本,每个支持的OS平台2个.并且许多内部代码必须是IFDEF才能处理Ansi/Unicode处理逻辑之间的差异.因此,对他们来说并不是真正可行或具有成本效益(此时为时已晚,特别是考虑到AnsiString移动操作系统平台不支持 - 尽管有第三方补丁可用于重新启用它).
这可能是一个长镜头,但是RAD Studio XE(我借用它来做一些测试的旧版本)文档说"默认情况下,类型字符串现在是一个Unicode字符串",这意味着这可以改变了.
不,它不能改变.RTL/VCL/FMX框架现在是Unicode.但这并不要求您的代码也必须是Unicode.仅在您需要与RTL/VCL/FMX直接交互的位置.其余代码可以根据需要继续使用AnsiString(或甚至std::string).