捐赠 | 广告 | 注册 | 发布 | 上传 | 关于我们    
  粤ICP备10103342号-1 DELPHI盒子 | 盒子文章 | 盒子问答悬赏 | 最新更新 | 盒子检索 | 下载中心 | 高级搜索    
  精品专区 | 繁體中文 | 奖励公告栏 | 直通车账号登陆 | 关闭GOOGLE广告 | 临时留言    
 
广告
评论:翻译:现有 Delphi 项目迁移到 Tiburon 中的注意事项
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
 用户名:
 密 码:
自动登陆(30天有效)
 
  DELPHI盒子版权所有 技术支持:深圳市麟瑞科技有限公司 1999-2024 V4.01 粤ICP备10103342号-1 更新RSS列表