Tôi đang làm việc để chuyển một số mã Delphi 7 sang XE4, vì vậy, unicode là chủ đề ở đây.Độ dài chuỗi Delphi Unicode theo byte
Tôi có phương thức trong đó chuỗi được ghi vào TMemoryStream, vì vậy theo this embarcadero article, tôi nên nhân chiều dài của chuỗi (trong ký tự) với kích thước của loại Char để có độ dài bằng byte cần thiết cho tham số length (in bytes) cho WriteBuffer.
vì vậy trước khi:
rawHtml : string; //AnsiString
...
memorystream1.WriteBuffer(Pointer(rawHtml)^, Length(rawHtml);
sau:
rawHtml : string; //UnicodeString
...
memorystream1.WriteBuffer(Pointer(rawHtml)^, Length(rawHtml)* SizeOf(Char));
sự hiểu biết của tôi về loại UnicodeString Delphi là nó UTF-16 trong nội bộ. Nhưng sự hiểu biết chung của tôi về Unicode là không phải tất cả các ký tự unicode đều có thể được biểu diễn ngay cả trong 2 byte, do đó một số ký tự ngoại ngữ trong trường hợp góc sẽ mất 4 byte. Another of embarcadero's articles dường như xác nhận rằng sự nghi ngờ của tôi, "Trên thực tế, thậm chí không đúng là một Char bằng hai byte!" Vì vậy ... điều đó khiến tôi băn khoăn liệu Length(rawHtml)* SizeOf(Char)
có thực sự đủ mạnh để luôn chính xác hay không, hoặc liệu có cách nào tốt hơn để xác định kích thước của chuỗi sẽ chính xác hơn không? Có phải không?
tại sao bạn không sử dụng 'TStringStream' thay vì' TMemoryStream'? – teran
Cuối cùng, MemoryStream được chuyển đến thành phần TWebBrowser để hiển thị. Khá nhiều ví dụ tôi từng thấy trong số đó đã sử dụng MemoryStream. StringStream sẽ là một lựa chọn tốt hơn cho mục đích đó? –
@Jessica Cuối cùng, cả hai đều dựa trên một 'TStream' có nghĩa là cấu trúc bên trong của cả hai làm việc giống nhau - nó chỉ là cách bạn tương tác với nó là khác nhau. Vì vậy, ngay cả một 'TFileStream' hoặc' TResourceStream' được áp dụng để sử dụng trong trường hợp của bạn, đó là, nếu bạn đang gửi tập tin hoặc tài nguyên cho trình duyệt của bạn anyway. –