Unicode 将Delphi 2006应用程序移植到XE
我想把几个大型应用程序从Delphi2006移植到XE。原因不在于Unicode,而是利用(希望)更好的IDE稳定性、本机PNG支持、更多的组件、更少的VCL错误、更少的对第三方内容的依赖、更少的来自你们的嘲笑等等。一些应用程序可能会从Unicode中受益,但目前这不是一个问题。目前,我只想采取最直接的方法让它们重新编译 首先,我更改了所有不明确的字符串声明,即string改为ansisting或ShortString,char改为AnsiChar,pChar改为pAnsiChar,并用D2006重新编译。到现在为止,一直都还不错。什么也没破 我的问题是:从这里到哪里?假设我只是将我的源代码展示给XE编译器,并轻描淡写,那么最大的问题可能是什么 比如说,Unicode 将Delphi 2006应用程序移植到XE,unicode,delphi-xe,porting,delphi-2006,ansistring,Unicode,Delphi Xe,Porting,Delphi 2006,Ansistring,我想把几个大型应用程序从Delphi2006移植到XE。原因不在于Unicode,而是利用(希望)更好的IDE稳定性、本机PNG支持、更多的组件、更少的VCL错误、更少的对第三方内容的依赖、更少的来自你们的嘲笑等等。一些应用程序可能会从Unicode中受益,但目前这不是一个问题。目前,我只想采取最直接的方法让它们重新编译 首先,我更改了所有不明确的字符串声明,即string改为ansisting或ShortString,char改为AnsiChar,pChar改为pAnsiChar,并用D200
var
S : AnsiString ;
...
MainForm.Caption := S ;
这会产生错误吗?警告?我假设VCL现在是Unicode的,或者XE会引入一个非Unicode组件,或者转换字符串?在XE中保留使用8位字符串的应用程序实际上可行吗,还是会有太多令人头痛的问题
如果最好/最简单的方法是使用Unicode,我会这样做,即使我不会使用扩展字符,至少在不久的将来
我想知道的另一件事是第三方的东西。我想我需要得到与XE兼容的更新版本
欢迎评论。VCL现在完全是Unicode,因此您显示的代码将生成一个编译器警告,而不是错误,关于从
AnsiString
到UnicodeString
的隐式转换。如果AnsiString
包含非ASCII字符(编译器无法验证),则这可能是有损转换。如果继续使用AnsiString
,则必须执行显式类型转换以避免出现警告:
var
S : AnsiString ;
...
MainForm.Caption := String(S);
最好不要像这样修改代码。接受Unicode。您的代码将更易于管理,并且更易于移植到未来的版本和平台。您应该将
AnsiString
的使用限制在实际需要Ansi的地方-网络通信、旧数据的文件I/O等。如果您想在应用程序中节省内存,特别是如果您仅使用ASCII字符,请使用UTF8String
而不是AnsiString
。UTF-8是一种8位的Unicode编码,UTF8String
和UnicodeString
之间的转换损失较小,没有编译器警告。VCL现在完全是Unicode,因此您显示的代码将生成编译器警告,而不是错误,关于从AnsiString
到UnicodeString
的隐式转换。如果AnsiString
包含非ASCII字符(编译器无法验证),则这可能是有损转换。如果继续使用AnsiString
,则必须执行显式类型转换以避免出现警告:
var
S : AnsiString ;
...
MainForm.Caption := String(S);
最好不要像这样修改代码。接受Unicode。您的代码将更易于管理,并且更易于移植到未来的版本和平台。您应该将
AnsiString
的使用限制在实际需要Ansi的地方-网络通信、旧数据的文件I/O等。如果您想在应用程序中节省内存,特别是如果您仅使用ASCII字符,请使用UTF8String
而不是AnsiString
。UTF-8是一种8位的Unicode编码,UTF8String
和UnicodeString
之间的转换在没有编译器警告的情况下损失更少。这是从2006年到2011年的一个飞跃
但是如果你认为:是可能的。
- 您必须使用新的转换方法转换字符串变量李>
- 您必须检查2006年到xe之间的所有版本,以了解库是如何更改的,因为有些库已被删除,有些库已被合并,还有一些库已被删除李>
- 您必须购买/下载第三方组件的升级(如果有)
- 您必须使用新的转换方法转换字符串变量李>
- 您必须检查2006年到xe之间的所有版本,以了解库是如何更改的,因为有些库已被删除,有些库已被合并,还有一些库已被删除李>
- 您必须购买/下载第三方组件的升级(如果有)
AnsiString
全局返回到String
没有什么大不了的(屁是一个很好的工具)。有相当数量的代码需要并假定字节大小的ASCII字符串。如果我将所有声明都恢复为“string”,XE将假定为UnicodeString。当我编写类似于的代码时,如果(S[3]=':')那么…
,它会警告我吗?这是我不想忽视的场景。:“
是一个字符文本。字符文字和字符串文字现在是上下文敏感的。当与Unicode解压
一起使用时,文字将是Unicode(在#XX
的特定情况下,在#80
-#FF
范围内的两位文字,其Unicode表示受新的HIGHCHARUNICODE
编译器指令的影响)String
、Char
和PChar
现在都是Unicode。如果S
是一个UnicodeString
,则将WideChar
与WideChar
进行比较。如果S
改为AnsiString
,则将AnsiChar
与AnsiChar
进行比较。在这两种情况下,都不需要编译器警告。确定@Remy我的观点是,如果我有现有的代码:vars:string;开始S:=“你好”;Writeln(SomeTextFile,S)代码>并且文件需要是8-bi