Delphi 7 のコードを XE4 に移植する作業を行っているので、ここではユニコードを取り上げます。
文字列を TMemoryStream に書き込むメソッドがあるため、この embarcadero の記事によると、文字列の長さ (文字単位) に Char 型のサイズを掛けて、必要な長さ (バイト単位) を取得する必要があります。 length (バイト単位) パラメータを WriteBuffer に渡します。
その前に:
rawHtml : string; //AnsiString
...
memorystream1.WriteBuffer(Pointer(rawHtml)^, Length(rawHtml);
後:
rawHtml : string; //UnicodeString
...
memorystream1.WriteBuffer(Pointer(rawHtml)^, Length(rawHtml)* SizeOf(Char));
Delphi の UnicodeString 型についての私の理解では、内部的には UTF-16 です。しかし、Unicode についての私の一般的な理解は、すべての Unicode 文字が 2 バイトでも表現できるわけではなく、一部の特殊な外国文字は 4 バイトかかるということです。Embarcadero の別の記事では、「実際には、1 つの Char が 2 バイトに等しいということは常に正しいとは限りません!」という私の疑念を裏付けているようです。
それで...それはLength(rawHtml)* SizeOf(Char)
、一貫して正確であるために本当に十分に堅牢であるかどうか、またはより正確になる文字列のサイズを決定するためのより良い方法があるかどうか疑問に思いますか?