是什么判断UnicodeString类型的变量是表示Unicode字符串还是ANSI字符串?

时间:2012-04-28 06:12:40

标签: delphi unicode delphi-xe2

我对Delphi很有经验,但对Unicode很新。

关于UnicodeString(System.UnicodeString)的嵌入式Delphi XE2文档说:

“Delphi使用多种字符串类型.UnicodeString可以包含Unicode和ANSI字符串。

对此类型的支持包括以下功能:

与可用内存一样大的字符串。 通过共享引用有效地使用内存。 基于当前语言环境评估字符串的例程和运算符。 尽管名称如此,但UnicodeString可以表示ANSI字符集字符串和Unicode字符串。 “

我不明白“可以”这个词是什么意思。 (“它可以包含Unicode和ANSI。”......“尽管它的名称,UnicodeString可以表示ANSI字符集字符串和Unicode字符串。”)

我的问题:什么决定了UnicodeString类型的变量是代表Unicode字符串还是ANSI字符串?

1 个答案:

答案 0 :(得分:3)

文档已过时。 XE2中的UnicodeString只能包含Unicode数据。

在CB2009和D2009中,当UnicodeString首次引入时,有些情况,主要是在C ++< - > Delphi交互中,其中RTL允许Ansi数据存储在{{1}中并将Unicode数据存储在UnicodeString中,以帮助用户将旧的Ansi代码迁移到Unicode。 AnsiStringUnicodeString具有统一的内部结构,Delphi编译器具有AnsiString指令,可以检测任何差异并在需要时执行静默数据转换。虽然它确实有效,但如果你不小心它也会产生微妙的副作用。

当XE发布时,Embarcadero认为用户有足够的时间进行迁移,因此删除了{$STRINGCHECKS}指令和支持RTL功能。 {$STRINGCHECKS}UnicodeString仍然具有统一的内部结构,因此技术上可以将Ansi数据存储在AnsiString中,将Unicode存储在UnicodeString中,但您必须直接操作内存来手动执行,编译器/ RTL不会在“正常”代码中执行此操作,并且在存在差异时不再执行静默转换,因此如果您不小心,可能会发生数据损坏和/或崩溃。