我对Delphi很有经验,但对Unicode很新。
关于UnicodeString(System.UnicodeString)的嵌入式Delphi XE2文档说:
“Delphi使用多种字符串类型.UnicodeString可以包含Unicode和ANSI字符串。
对此类型的支持包括以下功能:
与可用内存一样大的字符串。 通过共享引用有效地使用内存。 基于当前语言环境评估字符串的例程和运算符。 尽管名称如此,但UnicodeString可以表示ANSI字符集字符串和Unicode字符串。 “
我不明白“可以”这个词是什么意思。 (“它可以包含Unicode和ANSI。”......“尽管它的名称,UnicodeString可以表示ANSI字符集字符串和Unicode字符串。”)
我的问题:什么决定了UnicodeString类型的变量是代表Unicode字符串还是ANSI字符串?
答案 0 :(得分:3)
文档已过时。 XE2中的UnicodeString
只能包含Unicode数据。
在CB2009和D2009中,当UnicodeString
首次引入时,有些情况,主要是在C ++< - > Delphi交互中,其中RTL允许Ansi数据存储在{{1}中并将Unicode数据存储在UnicodeString
中,以帮助用户将旧的Ansi代码迁移到Unicode。 AnsiString
和UnicodeString
具有统一的内部结构,Delphi编译器具有AnsiString
指令,可以检测任何差异并在需要时执行静默数据转换。虽然它确实有效,但如果你不小心它也会产生微妙的副作用。
当XE发布时,Embarcadero认为用户有足够的时间进行迁移,因此删除了{$STRINGCHECKS}
指令和支持RTL功能。 {$STRINGCHECKS}
和UnicodeString
仍然具有统一的内部结构,因此技术上可以将Ansi数据存储在AnsiString
中,将Unicode存储在UnicodeString
中,但您必须直接操作内存来手动执行,编译器/ RTL不会在“正常”代码中执行此操作,并且在存在差异时不再执行静默转换,因此如果您不小心,可能会发生数据损坏和/或崩溃。