Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - UniCode Problem nach Upgrade D2007 -> XE5 (#0 im String)


CenBells - Do 30.01.14 22:35
Titel: UniCode Problem nach Upgrade D2007 -> XE5 (#0 im String)
Hallo zusammen,

nach langer Zeit habe ich mich entschlossen, mein D2007 durch XE5 abzulösen. Bislang haben mich mangelnde Zeit und die Unicode Thematik davon abgehalten.

Das Unicode thema ist nun zu einem Problem?! geworden, das ich zwar lösen konnte, allerdings bin ich mir nicht sicher, ob das der ideale weg ist.

Folgender Code aus D2007 (simplifiziert zu darstellungszwecken)


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
var
  LStream: TStringStream;
  LString: string;
begin
  LString := 'Dies ist ein test'#13#10;

  LStream := TStringStream.create('');
  LStream.WriteBuffer(LString[1], Length(LString));
  
  Memo1.Text := LStream.DataString
end;


Wenn ich diesen Code mit XE5 kompiliere, wird nur das erste Zeichen im Memo angezeigt. Im DataString ist hinter jedem Char des Quellstrings ein '#0' eingefügt worden.

Nach etwas recherche habe ich den obigen Code wie folgt geändert


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
var
  LStream: TStringStream;
  LString: string;
begin
  LString := 'Dies ist ein test'#13#10;

  LStream := TStringStream.create('', TEncoding.UniCode);
  LStream.WriteBuffer((Pointer(s)^, Length(s) * SizeOf(Char));
  
  Memo1.Text := LStream.DataString
end;


Nun ist die Anzeige im Memo ok, allerdings weiß ich nicht, ob ich mir irgendwelche Folgeprobleme reingeholt habe.

Wie ist denn Eure Erfahrung? Was habt ihr geändert? Würdet Ihr das auch so lösen?

Vielen Dank im Voraus.

viele GRüße
CenBells

Moderiert von user profile iconNarses: Code- durch Delphi-Tags ersetzt


jaenicke - Fr 31.01.14 00:23

Das ist so prinzipiell schon in Ordnung. Ob es die beste Lösung ist, lässt sich ohne etwas mehr Kontext (was passiert mit dem Stream, ...) schlecht sagen.

Das Beispiel an sich wäre so sinnvoller:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
var
  LStream: TStringStream;
  LString: string;
begin
  LString := 'Dies ist ein test'#13#10;

  LStream := TStringStream.create(LString, TEncoding.UniCode);
  
  Memo1.Text := LStream.DataString
end;


CenBells - Sa 01.02.14 22:55

Hallo jaenicke,

danke für die Antwort.

Der Stream selbst, wird an verschiedenen Stellen im Quellcode mit unterschiedlichen Strings befüllt. Der angegebene Code ist tatsächlic nur zur Darstellung sehr weit vereinfacht worden :)

Viele Grüße
CenBells