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

ドキュメントは古くなっています。UnicodeStringXE2では、Unicodeデータのみを含めることができます。

CB2009およびD2009UnicodeStringが最初に導入されたとき、主にC ++ <-> Delphiインタラクションで、RTLによりAnsiデータをに格納し、UnicodeStringUnicodeデータをに格納しAnsiStringてユーザーがレガシーAnsiコードをに移行できるようにする場合がありました。 Unicode。 UnicodeString統一された内部構造をAnsiString持っており、Delphiコンパイラには、{$STRINGCHECKS}不一致を検出し、必要に応じてサイレントデータ変換を実行するディレクティブがありました。それは機能しましたが、注意しないと微妙な副作用もありました。

XEがリリースされるまでに、Embarcaderoは、ユーザーが移行するのに十分な時間があると判断したため、{$STRINGCHECKS}ディレクティブとサポートするRTL機能が削除されました。UnicodeString内部構造が統一されてAnsiStringいるため、AnsiデータをaにUnicodeString、Unicodeをに格納することは技術的に可能AnsiStringですが、手動で行うにはメモリを直接操作する必要があります。コンパイラ/RTLは「通常の」コードでは行いません。 、および不一致が存在する場合はサイレント変換を実行しなくなるため、注意しないとデータの破損やクラッシュが発生する可能性があります。

于 2012-04-28T15:34:02.697 に答える