Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi ANSI-String nach Unicode wandeln (https://www.delphipraxis.net/147085-ansi-string-nach-unicode-wandeln.html)

BlueStarHH 1. Feb 2010 16:50


ANSI-String nach Unicode wandeln
 
Hallo ich habe einen ANSIString, der Unicode enthält und den ich in einen UnicodeString wandeln möchte (Delphi 2009). Wie mache ich das? Das Beispiel soll "Hallo" anzeigen, zeigt aber nichts da, wie man im Debugger sehen kann in AString noch immer eine #0 am Anfang steht (Stringende)

Delphi-Quellcode:
var
  AANSIString: AnsiString;
  AString: string;
begin
  AANSIString := #0'H'#0'a'#0'l'#0'l'#0'o';
  AString := AANSIString;
  ShowMessage(AString);

Bernhard Geyer 1. Feb 2010 16:59

Re: ANSI-String nach Unicode wandeln
 
Und wer macht sowas in einen AnsiString?
Da wirst du jetzt mit Harten Casts arbeiten müssen bzw. Speicher-Copierroutinen Inhalt deines AnsiStrings -> Speicheradresse von Unicodstring der zuvor mit SetLength auf passende größe gebraucht wurde.

Zacherl 1. Feb 2010 17:03

Re: ANSI-String nach Unicode wandeln
 
Ab D2009 hast du es eigentlich sehr einfach. Beispiel:
Delphi-Quellcode:
var
  A: AnsiString;
  U: String;
begin
  A := 'Hallo';
  // compiler Magic :)
  U := A;
  ShowMessage(U);
end;
In deinem Falle, müsstest du nur dafür sorgen, dass du die #0 vorher aus dem AnsiString entfernst.

BlueStarHH 1. Feb 2010 17:07

Re: ANSI-String nach Unicode wandeln
 
Zitat:

Zitat von Bernhard Geyer
Und wer macht sowas in einen AnsiString?
Da wirst du jetzt mit Harten Casts arbeiten müssen bzw. Speicher-Copierroutinen Inhalt deines AnsiStrings -> Speicheradresse von Unicodstring der zuvor mit SetLength auf passende größe gebraucht wurde.

Meinst Du mit harten Casts das hier:

Delphi-Quellcode:
AString := String(AANSIString);
Das ändern auch nichts am Ergebnis.

Wäre es einfacher wenn man statt des AnsiStrings einen RawByteString hätte? Wie könnte man den in Unicode wandeln? Das Grundproblem ist folgendes: Ich habe eine ANSI-Datei die zeileweise eingelesen wird. In einer Zeile kann an einer beliebigen Stelle ein Unicode-String anfangen (bis zum Zeilenende). Das ist durch $FE$FF markiert. Daher dachte ich, dass es am einfachsten ist, diesen Teil einfach per Copy aus dem Ansi-String zu kopieren und in einen Unicode string zu wandel. Mit den ANSI-Inhalten davor werden noch ein paar Prüfungen angestellt, ob man den Unicodestring überhaupt braucht oder nicht.

BlueStarHH 1. Feb 2010 17:09

Re: ANSI-String nach Unicode wandeln
 
Zitat:

Zitat von Zacherl
Ab D2009 hast du es eigentlich sehr einfach. Beispiel:
Delphi-Quellcode:
var
  A: AnsiString;
  U: String;
begin
  A := 'Hallo';
  // compiler Magic :)
  U := A;
  ShowMessage(U);
end;
In deinem Falle, müsstest du nur dafür sorgen, dass du die #0 vorher aus dem AnsiString entfernst. Ich bin nicht sicher, aber es könnte reichen die 0 am Anfang zu entfernen, um sie ans Ende anzuhängen. (Dadurch müsstest du zwischen Little Endian und Big Endian Kodierung wechseln)

Nein das klappt nicht. Egal ob die Null nun am Anfang oder Ende ist. Wenn die Null am Anfang ist, wird nichts angezeigt. Wenn die Null am Ende ist wird nur das H angezeigt. Ich verwendet Delphi 2009.

Zacherl 1. Feb 2010 17:13

Re: ANSI-String nach Unicode wandeln
 
Probiers mal so:
Delphi-Quellcode:
var
  A: AnsiString;
  U: String;
  I: Integer;
begin
  A := #0'H'#0'a'#0'l'#0'l'#0'o';
  SetLength(U, Length(A) div 2);
  for I := 1 to Length(A) do
  begin
    if (A[I] <> #0) then
      U[I div 2] := Char(A[I]);
  end;
  ShowMessage(U);
end;

Bernhard Geyer 1. Feb 2010 17:17

Re: ANSI-String nach Unicode wandeln
 
Zitat:

Zitat von BlueStarHH
Meinst Du mit harten Casts das hier:

Delphi-Quellcode:
AString := String(AANSIString);

Nee. Hier wird der Compiler eine "weiche" Wandlung durchführen. Du mußt eher nach PWidechar casten und die Compilerwarnungen ignorieren.

Zitat:

Zitat von BlueStarHH
Ich habe eine ANSI-Datei die zeileweise eingelesen wird. In einer Zeile kann an einer beliebigen Stelle ein Unicode-String anfangen (bis zum Zeilenende). Das ist durch $FE$FF markiert.

Dann ist es keine ANSI-Datei mehr.

Lese die Datei mit TFileStream ein und wandle dann die eingelesenen Datenblöcke passend nach ANSI oder Unicodestring.

BlueStarHH 1. Feb 2010 17:18

Re: ANSI-String nach Unicode wandeln
 
Zitat:

Zitat von Zacherl
Probiers mal so:
Delphi-Quellcode:
var
  A: AnsiString;
  U: String;
  I: Integer;
begin
  A := #0'H'#0'a'#0'l'#0'l'#0'o';
  SetLength(U, Length(A) div 2);
  for I := 1 to Length(A) do
  begin
    if (A[I] <> #0) then
      U[I div 2] := Char(A[I]);
  end;
  ShowMessage(U);
end;

In A kann ein beliebier Unicode string stehen. Es müssen dort keine Nullen stehen! Es kann dort z.B. auch auch #5 stehen.

Bernhard Geyer 1. Feb 2010 17:19

Re: ANSI-String nach Unicode wandeln
 
Zitat:

Zitat von BlueStarHH
In A kann ein beliebier Unicode string stehen. Es müssen dort keine Nullen stehen! Es kann dort z.B. auch auch #5 stehen.

Vor allem dieser Code ist nicht €-Zeichen Kompatible (auch wenn nur Ansi-Character in den entsprechenden Unicode-Strings stehen würden).

himitsu 1. Feb 2010 17:43

Re: ANSI-String nach Unicode wandeln
 
wie? selber kopieren ... fertiges gibt es hierfür nicht
Move / MoveMemory


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:18 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz