調用 Read/ReadBuffer 方法的范例:
var
S: string;
L: Integer;
Stream: TStream;
Temp: AnsiString;
begin
// 現有代碼- 當 string = UnicodeString 時它是不正確的
Stream.Read(L, SizeOf(Integer));
SetLength(S, L);
Stream.Read(Pointer(S)^, L);
// 正確的 Unicode 寫法如下
Stream.Read(L, SizeOf(Integer));
SetLength(S, L);
Stream.Read(Pointer(S)^, L * SizeOf(Char)); // <<-- Specify buffer size in bytes
//正確的 Ansi 寫法如下
Stream.Read(L, SizeOf(Integer));
SetLength(Temp, L); // <<-- 使用臨時的變量 AnsiString
Stream.Read(Pointer(Temp)^, L * SizeOf(AnsiChar)); // <<-- Specify buffer size in bytes
S := Temp; // <<-- 放寬 string 到 Unicode
end;
上面的解決方案依賴於您存儲在 Stream 中的字符串的編碼格式,更好的讀取和轉換他們建議使用 TEncoding 類。
調用 Write/WriteBuffer 的范例:
var
S: string;
Stream: TStream;
Temp: AnsiString;
begin
// 現有代碼 - 當 string = UnicodeString 時它是錯的
Stream.Write(Pointer(S)^, Length(S));
// 正確的讀取 Unicode 的代碼
Stream.Write(Pointer(S)^, Length(S) * SizeOf(Char)); // <<-- Specify buffer size in bytes
// 正確的讀取 Ansi 的代碼
Temp := S; // <<-- Use temporary AnsiString
Stream.Write(Pointer(Temp)^, Length(Temp) * SizeOf(AnsiChar));// <<-- Specify buffer size in bytes
end;