我用SQL SERVER生成的SQL脚本文件,如果文件格式使用默认的国际化文本(Unicode)的话,在程序中无论是用TStrings还是TMemoryStream的LoadFromFile,或者使用TextFile直接进行ReadLn或者Read都无法读取正确的文本信息(读出来的是一小段看不懂的乱码,用记事本直接打开该文件的话看到的也是正确的文本)。只有在生成SQL脚本时选中“WINDOWS文本(ANSI)”文件格式才可以用上述方法读取。
  请问如何才能从Unicode文件格式的文件中读取文本信息?

解决方案 »

  1.   

    TStrings 这些都是单字节字符串,支持不了Unicode,这是VCL的一个缺憾,VCL.net已经开始支持unicode了如果你想执行这些脚本,你不妨使用ADO的ADODataSet或者ADOCommand,他们支持Unicode,他们储存SQL语句的字符串是WideString,支持Unicode
      

  2.   

    var
     FileStrm: TFileStream;
     FileContent: WideString;
     ContentSize: Integer;
    begin
      FileStrm := TFileStream.Create('E:\test.txt', fmOpenRead);
      ContentSize := FileStrm.Size - 2;
      SetLength(FileContent, ContentSize div 2);
      FileStrm.Position := 2;//跳过Unicode标志
      FileStrm.Read(FileContent[1], ContentSize);
      Memo1.Lines.Text := FileContent;
      FileStrm.Free;
    end;
    这是Unicode格式,如果是UTF-8格式就只能作为String读出来再用API去转换了。如果要处理Ansi和Unicode两种格式可以先读取前两个Ansi字符,如果分别是#$FF和#$FE则是Unicode格式。