Thema: Delphi Unicode + BASE64?

Einzelnen Beitrag anzeigen

blackdrake

Registriert seit: 22. Aug 2003
Ort: Bammental
618 Beiträge
 
Delphi 10.3 Rio
 
#35

Re: Unicode + BASE64?

  Alt 26. Aug 2007, 01:42
Hallo.

Danke für die Codeteile. Leider funktioniert es auch nicht ganz. Ich habe auch ergänzend sizeof(WideChar) dazugehängt.

"testこれはちょうどテストであtes" wird bei deinem Beispiel zu "ₘî淪C๰ê" (nur halb so lang weil *2 vergessen, was aber jetzt auch erstmal egal ist).

Probier es selbst aus:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);

  function ReadNullTerminatedWideString(const Stream: TStream): WideString;
  var
    S: WideString;
    WC: WideChar;
  begin
    S := '';
    repeat
      Stream.ReadBuffer(WC, 2);
      if (WC <> #0) then
        S := S + WC;
    until WC = #0;
    Result := S;
  end;

var
  test: TFileStream;
  ws: widestring;
  ans: AnsiString;
begin
  test := TFileStream.Create('c:\uni.txt', fmOpenRead or fmShareDenyNone);
  ws := ReadNullTerminatedWideString(test);

  SetLength(ans, Length(ws));
  CopyMemory(@ans[1], @ws[1], Length(ans));

  test.free;

  deletefile('c:\uni2.txt');
  test := TFileStream.Create('c:\uni2.txt', fmCreate);
  test.writebuffer(ans, length(ans));
  test.free;
end;
Die Datei c:\uni.txt muss den Text

testこれはちょうどテストであtes[NULL][NULL]

enthalten.

Außerdem habe ich noch sowas hier probiert. Ebenfalls alles ohne Erfolg!

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);

  function ReadNullTerminatedWideString(const Stream: TStream): WideString;
  var
    S: WideString;
    WC: WideChar;
  begin
    S := '';
    repeat
      Stream.ReadBuffer(WC, 2);
      if (WC <> #0) then
        S := S + WC;
    until WC = #0;
    Result := S;
  end;

var
  test: TFileStream;
  ws: widestring;
  s: string;
  PWC: PWideChar;
  data: array of pchar; // string, array of char und pchar gingen auch nicht
begin
  test := TFileStream.Create('c:\uni.txt', fmOpenRead or fmShareDenyNone);
  ws := ReadNullTerminatedWideString(test);

  PWC := PWideChar(ws);

  //Data := GetMemory(Length(ws) * sizeof(WideChar));

  SetLength(Data, Length(ws) * sizeof(WideChar));

  // Hab schon mit und ohne @ sowie mit und ohne [0] ausprobiert, ging alles nicht
  CopyMemory(@Data[0], @PWC, Length(ws) * sizeof(WideChar));

  s := string(Data);

  test.free;

  deletefile('c:\uni2.txt');
  test := TFileStream.Create('c:\uni2.txt', fmCreate);
  test.writebuffer(s, length(s));
  test.free;
end;
Ob es jetzt sinnvoll ist oder nicht, was ich hier mache. Ist eigentlich egal. Aber irgendwie muss es doch funktionieren, dass man per CopyMemory einen Variableninhalt von x nach y kopiert. Hier ist irgendwo der Wurm drin!!

EDIT

Ich demonstriere nochmal, dass meine Lese- / Schreibfunktionen nicht schuld sind. Es wird ein WideString korrekt eingelesen und anschließend wieder geschrieben.

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);

  function ReadNullTerminatedWideString(const Stream: TStream): WideString;
  var
    S: WideString;
    WC: WideChar;
  begin
    S := '';
    repeat
      Stream.ReadBuffer(WC, 2);
      if (WC <> #0) then
        S := S + WC;
    until WC = #0;
    Result := S;
  end;

var
  test: TFileStream;
  ws: widestring;
  pwc: pwidechar;
begin
  test := TFileStream.Create('c:\uni.txt', fmOpenRead or fmShareDenyNone);
  ws := ReadNullTerminatedWideString(test);
  test.free;

  deletefile('c:\uni2.txt');
  test := TFileStream.Create('c:\uni2.txt', fmCreate);
  pwc := PWideChar(ws);
  test.write(pwc^, length(ws) * sizeof(widechar));
  test.WriteBuffer(#00#00, 2);
  test.free;
end;
uni.txt und uni2.txt sind danach absolut identisch. Es liegt wie gesagt bei der Umwandlung des WideStrings in einen doppelt großen Ansi-String.

Gruß
blackdrake
Angehängte Dateien
Dateityp: txt uni_114.txt (42 Bytes, 3x aufgerufen)
Daniel Marschall
  Mit Zitat antworten Zitat