upp
35688
|
2008/10/10 11:19:28 |
>>fhx123
上面那个L是假设存储string的方式是先存储一个32位整数,表示接下来的字符数,然后存储具体文本的示例代码。主要讲的重点是这样的代码在读取Stream的时候,需要对L做乘上Char宽度的长度,才能在unicode下不至于因为unicode的一个字符占用2个byte的原因而读出原来数据的一半,导致不正确的情况发生。所以上面这个例子并不是假设TStringList的SaveToStream是按照这个先写Integer表示字符数,后写Str的方式来存储字符的! |
fhx123
35645
|
2008/10/8 5:27:27 |
以下是我的测试代码:
procedure TForm1.Button1Click(Sender: TObject); var st:TStrings; S: string; L: Integer; Stream: TStream; begin st:=TStringList.Create; st.LoadFromFile('C:\现有 Delphi 项目迁移到 Tiburon 中的注意事项.txt'); // 正确的 Unicode 写法如下 Stream:=TStringStream.Create; try st.SaveToStream(Stream); st.Free; Stream.Position:=0; Stream.Read(L, SizeOf(Integer)); edit1.Text:=inttostr(l); SetLength(S, L); Stream.Read(Pointer(S)^, L * SizeOf(Char)); // <<-- Specify buffer size in bytes memo1.Text:=s; finally Stream.Free; end; end;
procedure TForm1.Button2Click(Sender: TObject); var st:TStrings; S: string; L: Integer; Stream: TStream; Temp: AnsiString; begin st:=TStringList.Create; st.LoadFromFile('C:\现有 Delphi 项目迁移到 Tiburon 中的注意事项.txt'); //正确的 Ansi 写法如下 Stream:=TStringStream.Create; try st.SaveToStream(Stream); st.Free; Stream.Position:=0; Stream.Read(L, SizeOf(Integer)); edit2.Text:=inttostr(l); SetLength(Temp, L); // <<-- 使用临时的变量 AnsiString Stream.Read(Pointer(Temp)^, L * SizeOf(AnsiChar)); // <<-- Specify buffer size in bytes S := Temp; // <<-- 放宽 string 到 Unicode memo2.Text:=s; finally Stream.Free; end; end; |
fhx123
35644
|
2008/10/8 5:26:15 |
Stream 的 Read/Write 替换为 AnsiString, SizeOf(Char),或者使用 TEncoding 类 调用 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 类。
这个例子中,L 总是负数的,能做什么? |
第一页 |
上一页
|
下一页
|
最后页 |
有
3
条纪录 共1页
1
-
3
|
|