Delphi Chaîne Unicode Longueur en Octets

Je suis en train de travailler sur le portage de certains Delphi 7 du code de XE4, donc, unicode est le sujet ici.

J'ai une méthode où une chaîne est écrite pour un TMemoryStream, selon cette embarcadero article, je devrais multiplier la longueur de la chaîne (de caractères) fois la taille du type Char pour obtenir la longueur, en octets, ce qui est nécessaire pour la longueur (en octets) paramètre WriteBuffer.

auparavant:

rawHtml : string; //AnsiString
...
memorystream1.WriteBuffer(Pointer(rawHtml)^, Length(rawHtml);

après:

rawHtml : string; //UnicodeString
...
memorystream1.WriteBuffer(Pointer(rawHtml)^, Length(rawHtml)* SizeOf(Char));

Ma compréhension de Delphi UnicodeString type, c'est que c'est de l'UTF-16 en interne. Mais ma compréhension générale de l'Unicode, c'est que pas tous les caractères unicode peuvent être représentés, même dans les 2 octets, que certains cas de coin caractères étrangers prendront 4 octets. Un autre de embarcadero articles semble confirmer mes soupçons, "En fait, il n'est même pas toujours vrai qu'un Char est égale à deux octets!"

Donc...qui me laisse penser que Length(rawHtml)* SizeOf(Char) va vraiment être suffisamment robuste pour être toujours exactes, ou s'il existe une meilleure façon de déterminer la taille de la chaîne à être plus précis?

pourquoi n'utilisez-vous pas TStringStream au lieu de TMemoryStream?
En fin de compte MemoryStream est passé à un composant TWebBrowser à afficher. Presque tous les exemple que j'ai vu de qui a utilisé MemoryStream. Serait StringStream être un meilleur choix pour ce but?
En fin de compte, ils sont tous deux basés sur une TStream ce qui signifie que la structure interne des deux fonctionnent de la même - c'est juste la façon dont vous interagissez avec elle c'est différent. De sorte que même une TFileStream ou TResourceStream sont applicables à l'utilisation dans votre cas, qui est, si vous avez été l'envoi de Fichiers ou Ressources à votre navigateur de toute façon.
Ça me fait toujours mal que Delphi n'est pas d'utiliser l'UTF8 en interne.
TStringStream est TMemoryStream descendant, il est donc logique de le remplacer

OriginalL'auteur Jessica Brown | 2013-05-13