【问题标题】:What determines if a variable of type UnicodeString represents a Unicode string or an ANSI string?什么决定了 UnicodeString 类型的变量代表 Unicode 字符串还是 ANSI 字符串?
【发布时间】:2012-04-28 06:12:39
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

    标签: delphi unicode delphi-xe2


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-09
      • 1970-01-01
      • 2019-08-04
      • 1970-01-01
      • 2011-03-02
      • 2014-03-15
      • 1970-01-01
      • 2019-11-21
      相关资源
      最近更新 更多