Delphi2010的String默认为Unicode(utf-16)
请教大家,如何将一个含有中文的string写入到一个memoryStream(如RO中的Binary)中并正确读取出来,原来d7下的代码不行了...

解决方案 »

  1.   

    function StreamToString(aStream: TStream): string;
    var
      SS: TStringStream;
    begin
      if aStream <> nil then
      begin
        SS := TStringStream.Create('');
        try
          aStream.Position := 0;
          SS.CopyFrom(aStream, aStream.Size);
          Result := SS.DataString;
        finally
          SS.Free;
        end;
      end else
      begin
        Result := '';
      end;
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
      BinData: Binary;
      aChar: PChar;
    begin
      aChar := '你';  try
        BinData := Binary.Create;
        BinData.Write(aChar^, Length(aChar)*Sizeof(Char));
        Memo1.Lines.Add(StreamToString(BinData));
      finally
        BinData.Free;
      end;
    end;用中文读出来乱码,英文可以。
      

  2.   

    有必要这么复杂吗?
    直接用TStringStream就行了吧:
    SS.Write('你'); // 写
    SS.DataString;  // 读
      

  3.   

    那就强制用ASCII吧,只需把写的代码改一下:
    procedure TForm1.Button1Click(Sender: TObject);
    var
      BinData: Binary;
      aChar: PAnsiChar;
    begin
      aChar := '你';  try
      BinData := Binary.Create;
      BinData.Write(aChar^, Length(aChar));
      Memo1.Lines.Add(StreamToString(BinData));
      finally
      BinData.Free;
      end;
    end;
      

  4.   

    自己搞定了:procedure TForm1.Button1Click(Sender: TObject);
    var
      BinData: Binary;
      aStr,bStr: string;
      sSize: Integer;
    begin
      aStr := 'aaa你好asas';
      sSize := Length(aStr)*SizeOf(string);
      try
        BinData := Binary.Create;
        BinData.Write(pointer(aStr)^, sSize);    BinData.Seek(0,soFromBeginning);  //BinData.Position := 0;
        SetLength(bStr,sSize);
        BinData.Read(pointer(bStr)^,sSize);    Memo1.Lines.Add(bStr);
      finally
        BinData.Free;
      end;
    end;