私はDelphi 7のコードをXE4に移植していますので、ここではUnicodeが対象です。DelphiのUnicode文字列の長さ(バイト単位)
文字列がTMemoryStreamに書き込まれる方法があるので、this embarcadero articleによれば、文字列の長さにChar型のサイズを乗じて、必要なバイト数で長さを取得する必要がありますWriteBufferの長さ(バイト単位)のパラメーター。
ので、前に:
rawHtml : string; //AnsiString
...
memorystream1.WriteBuffer(Pointer(rawHtml)^, Length(rawHtml);
後:DelphiのUnicodeString型の
rawHtml : string; //UnicodeString
...
memorystream1.WriteBuffer(Pointer(rawHtml)^, Length(rawHtml)* SizeOf(Char));
私の理解で、それは内部的にUTF-16であるということです。しかし、私の一般的なUnicodeの理解は、すべてのUnicode文字を2バイトで表現できるわけではなく、いくつかのコーナーケースの外部文字は4バイトを取るということです。 Another of embarcadero's articlesは私の疑惑を確認しているようです。「実際には、1つのCharが2バイトに等しいことは事実ではありません!
だから、Length(rawHtml)* SizeOf(Char)
が本当に正確であるかどうか、またはより正確な文字列のサイズを判断するためのよりよい方法があるかどうかは疑問に思えます。
なぜ、「TMemoryStream」の代わりに「TStringStream」を使用しないのですか? – teran
最終的に、MemoryStreamはTWebBrowserコンポーネントに渡されて表示されます。私が見てきたすべての例は、MemoryStreamを使っています。その目的のためにStringStreamを使用するのが良いでしょうか? –
@Jessica結局、彼らはどちらも 'TStream'をベースにしています。つまり、両方の内部構造が同じであることを意味します。とにかくTFileStreamやTResourceStreamもあなたの場合に使用することができます。つまり、あなたのブラウザにファイルやリソースを送信していた場合です。 –