其他分享
首页 > 其他分享> > AnsiString是Embarcadero C Builder中类型字符串的默认值?

AnsiString是Embarcadero C Builder中类型字符串的默认值?

作者:互联网

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

但我有一个问题,我希望有一个简单的解决方案:

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

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

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

这可能是一个长镜头,但是RAD Studio XE(我借用它来做一些测试的旧版本)文档说“默认情况下,类型字符串现在是一个Unicode字符串”,这意味着这可以改变了.然而,这在当前版本(XE8)的文档中被重新描述,所以……

解决方法:

I have inherited an old Borland C++ Builder application which I now must migrate to a new development tool. The suggested way to go is with Embarcadero C++ Builder

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

The main problem I have is that with Embarcadero C++, the type string is now a UnicodeString instead of an AnsiString (as it was in Borland C++ Builder).

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

Using Unicode in this application is not an option – the files it work with are ANSI formatted.

然后不要使用UnicodeString来处理它们.继续使用AnsiString.

Modifying the code to use AnsiString (and similar) is doable, but i’d rather not since it uses a lot of TStringList (and similar) constructs.

另一方面,那将是一个问题,是的.大多数RTL现在只支持UnicodeString.因此,必须重写使用TStringList的代码,例如通过使用TList< AnsiString>或者std :: vector< AnsiString>相反(除非代码使用TStringList::(逗号|分隔)文本属性,在这种情况下,你有一个更大的重写).但是,对于AnsiString解析代码,许多较旧的基于AnsiString的RTL函数被移动到单独的System.AnsiStrings单元,因此您可以添加#include< System.AnsiStrings.hpp>到你的代码来达到他们.

So my question is: Is there a setting or compiler option or something that I can use to tell Embarcadero to use System.AnsiString as definition for string instead of System.UnicodeString?

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

This is probably a long-shot, but the RAD Studio XE (which is the older version that I have borrowed to make a few tests) documentation says “by default, the type string is now a Unicode string”, which implies that this can be changed.

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

标签:unicode-string,ansistring,c,cbuilder
来源: https://codeday.me/bug/20190824/1710739.html