0

我对 Delphi 有经验,但对 Unicode 很陌生。

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

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

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

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

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

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

4

1 回答 1

3

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

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

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

于 2012-04-28T15:34:02.697 回答