문제

다음과 같은 것처럼 보이는 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에서 많은 정크 캐릭터를 제공합니다. 이것이 유니 코드 준수 문제 때문이라는 것을 알고 있지만 문제를 해결하는 방법은 확실하지 않습니다.

지금까지 시도한 내용은 다음과 같습니다.

  • SourceBuffer의 데이터 유형 (및 widestring이 예상 한 매개 변수)을 pwidechar로 변경

  • 모든 것 여기에 나열된 제안

내가 뭘 잘못하고 있죠?

도움이 되었습니까?

해결책

스트림에 문자열을 쓰기 위해 별도의 버퍼가 필요하지 않습니다. 아마도 가장 간단한 방법은 문자열을 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 2010은 여기에 문서화 된 훌륭한 솔루션이 있습니다.

http://docwiki.embarcadero.com/codeexamples/en/streamstrrdwr_%28delphi%29

var
  Writer: TStreamWriter;
...

  { Create a new stream writer directly. }
  Writer := TStreamWriter.Create('MyFile.txt', false, TEncoding.UTF8);
  Writer.Write('Some Text');

  { Close and free the writer. }
  Writer.Free();
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top