繁体   English   中英

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

[英]AnsiString as default for type string in Embarcadero C++ Builder?

我继承了一个旧的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 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>进行TList<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 )。

可能我有个坏消息。 他们总是谈论迁移,而没有快速解决方案。

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中的弦乐。 到底是谁想出了从1而不是0对其编号?

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字符串。 ”,但我无法使用它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM