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