delphi - 在 Delphi 2010 中将字符串写入 TFileStream

标签 delphi unicode delphi-2010 delphi-2007

我的 Delphi 2007 代码如下所示:

procedure WriteString(Stream: TFileStream; var SourceBuffer: PChar; s: string);
begin
  StrPCopy(SourceBuffer,s);
  Stream.Write(SourceBuffer[0], StrLen(SourceBuffer));
end;

我这样调用它:

var
  SourceBuffer : PChar;
  MyFile: TFileStream;

....

SourceBuffer := StrAlloc(1024);
MyFile := TFileStream.Create('MyFile.txt',fmCreate);
WriteString(MyFile,SourceBuffer,'Some Text');
....

这在 Delphi 2007 中有效,但在 Delphi 2010 中却给了我很多垃圾字符。我知道这是由于 unicode 合规性问题,但我不确定如何解决该问题。

这是我迄今为止尝试过的:

  • 更改数据类型 SourceBuffer(还有参数 由 WideString 期望)到 PWideChar

  • suggestions listed here 中的每一个

我做错了什么?

最佳答案

您不需要单独的缓冲区来将字符串写入流。也许最简单的方法是将字符串编码为 UTF8,如下所示:

procedure TStreamEx.writeString(const data: string);
var
   len: cardinal;
   oString: UTF8String;
begin
   oString := UTF8String(data);
   len := length(oString);
   self.WriteBuffer(len, 4);
   if len > 0 then
      self.WriteBuffer(oString[1], len);
end;

function TStreamEx.readString: string;
var
   len: integer;
   iString: UTF8String;
begin
   self.readBuffer(len, 4);
   if len > 0 then
   begin
      setLength(iString, len);
      self.ReadBuffer(iString[1], len);
      result := string(iString);
   end;
end;

我已将 TStreamEx 声明为 TStream 的类帮助程序,但将它们重写为像您的示例一样的单独过程和函数应该不会太困难。

关于delphi - 在 Delphi 2010 中将字符串写入 TFileStream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1434413/

相关文章:

c - 汉字UTF-8宽度显示问题

delphi - 如何将Jedi的帮助文件与Delphi的IDE集成?

delphi - ComboBoxEx 和事件

multithreading - 如何显示并行线程中的进度

delphi - 在更多项目上加载资源(图像)

delphi - Delphi 中的动态菜单/操作

delphi - 如何使用类型类的辅助泛型

oracle - 如何知道我的Oracle系统是否设置为支持Unicode或多字节字符?

c - C 中使用 ncursesw 输出 "█"

Delphi 2010内联没用吗?