Pracuję nad przeniesieniem kodu Delphi 7 do XE4, więc tematem jest tutaj unicode.Delphi Unicode String Length w bajtach
Mam metodę, w której ciąg jest zapisywany do TMemoryStream, więc zgodnie z this embarcadero article powinienem pomnożyć długość ciągu znaków (w znakach) razy rozmiar typu Char, aby uzyskać długość w bajtach, które są potrzebne dla parametru length (w bajtach) do WriteBuffer.
więc przed:
rawHtml : string; //AnsiString
...
memorystream1.WriteBuffer(Pointer(rawHtml)^, Length(rawHtml);
po:
rawHtml : string; //UnicodeString
...
memorystream1.WriteBuffer(Pointer(rawHtml)^, Length(rawHtml)* SizeOf(Char));
moje rozumienie Delphi typu UnicodeString jest to, że UTF-16 wewnętrznie. Ale moje ogólne zrozumienie Unicode polega na tym, że nie wszystkie znaki Unicode mogą być reprezentowane nawet w 2 bajtach, a niektóre znaki obce przypadku zajmą 4 bajty. Another of embarcadero's articles wydaje się potwierdzać moje podejrzenia: "W rzeczywistości nie zawsze jest prawdą, że jeden znak równy jest dwóm bajtom!"
Więc ... to mnie zastanawia, czy Length(rawHtml)* SizeOf(Char)
będzie wystarczająco solidny, aby być konsekwentnie dokładnym, czy też istnieje lepszy sposób określenia rozmiaru ciągu, który będzie dokładniejszy?
dlaczego nie można użyć 'TStringStream' zamiast' TMemoryStream'? – teran
Ostatecznie MemoryStream jest przekazywany do komponentu TWebBrowser do wyświetlenia. Prawie każdy przykład, jaki widziałem, używał MemoryStream. Czy StringStream będzie lepszym wyborem w tym celu? –
@Jessica W końcu oba opierają się na 'TStream', co oznacza, że wewnętrzna struktura obu działa tak samo - to właśnie sposób interakcji z nią jest inny. Tak więc nawet 'TFileStream' lub' TResourceStream' można zastosować w twoim przypadku, to znaczy, jeśli mimo to wysyłałeś pliki lub zasoby do przeglądarki. –