Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Unicode-Umwandlung (https://www.delphipraxis.net/97375-unicode-umwandlung.html)

blackdrake 9. Aug 2007 13:57


Unicode-Umwandlung
 
Hallo.

Ich bin dabei, eine Funktion zu schreiben, die den Originalnamen einer Papierkorb-Datei herausfindet. Im Endeffekt möchte ich ein Element wiederherstellen und dabei eigene Schritte durchführen (keine API-Direktfunktion). Dafür wird die Recycler\...\INFO2 Datei ausgelesen. Der Dateiname liegt im Unicode vor. Nun möchte ich, sofern die Datei wiederhergestellt wird, dass diese auch im Unicode wiederhergestellt wird. Wie stelle ich das an?

Als erstes brauche ich eine Funktion, die ANSI in Unicode umwandelt. Ich habe unter http://www.swissdelphicenter.ch/de/showcode.php?id=1692 was gefunden, kann damit aber nichts anfangen:

Delphi-Quellcode:
showmessage(StringToWideString(#$53#$30#$8C#$30#$6F#$30#$5E#$97#$38, 0));
// sollte (...) irgendwelche japanischen Zeichen von sich geben
Und zweitens sollte renamefile() Unicode verstehen können, sodass die Datei auch im Unicode wiederhergestellt wird.

Gruß
blackdrake

Bernhard Geyer 9. Aug 2007 14:04

Re: Unicode-Umwandlung
 
In den ehemals kostenlosen TNTWare-Pack gibt es viele Unicode-Enabled Funktionen um mit Unicode-Dateinamen arbeiten zu können.

blackdrake 9. Aug 2007 14:09

Re: Unicode-Umwandlung
 
Habe ich auch schon gesehen, jedoch möchte ich nur eine einzigste Funktion, die diese Wiederherstellung und eine vorherige Prozedur erledigt.

blackdrake 11. Aug 2007 02:29

Re: Unicode-Umwandlung
 
Gibts mit Delphi keine Lösung, eine Datei mit Unicode umzubenennen? :cry:

Robert Marquardt 11. Aug 2007 06:28

Re: Unicode-Umwandlung
 
Du koenntest dich mal mit den Win32 Funktionen vertraut machen. Dateien umbenennen geschieht mit MoveFile. Die Fuktion gibt es in den Varianten MoveFileA und MoveFileW.

blackdrake 11. Aug 2007 09:13

Re: Unicode-Umwandlung
 
Hallo.

Danke für den Tipp. W steht ja für WideChar und einen Unicode müsste ich dahin umwandeln können. Habe bereits viel rumprobiert, komme aber nicht weiter :(

Hier ist ein Testscript:

Delphi-Quellcode:
// convert a multibyte string to a wide string using Multibyte to wide char

// Modifikation von [url]http://www.jpgriffiths.com/tutorial/api/multibytetowidechar.html[/url]
// -> Versuch, Rückgabewert von WideString in pWideChar zu wandeln

Function testfunktion(MBString : String) : pWideChar;
var
  Size : Integer;
  WcBuffer : Array[0..MAX_PATH] of WideChar;
  tmp: string; //+
begin
   // obtain the size required for the widechar buffer
  Size := MultiByteToWideChar(CP_ACP, 0, PChar(MBString), -1, nil, 0);

  if (Size > 0)
  and (Size < MAX_PATH) then begin
     MultiByteToWideChar(CP_ACP, 0, PChar(MBString), -1, @WCBuffer, Size);

     // Auf ... zugewiesener Wert wird niemals benutzt
     Result := WCBuffer; // Result := @WCBuffer[1];
  end else

  tmp := ''; //+
     Result := @tmp[1];
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  s: string;
begin
  // [url]http://www.jpgriffiths.com/tutorial/api/multibytetowidechar.html[/url]
  // [url]http://209.85.135.104/search?q=cache:j4l_ibuN2mEJ:forum.dsdt.info/viewtopic.php%3Ft%3D30046+delphi+MultiByteToWideChar&hl=de&ct=clnk&cd=1&gl=de[/url]

  //showmessage(get_recycler_filename('C:\Recycler\S-1-5-21-515967899-1957994488-839522115-1003\Dc129.txt'));
  s := #$00#$53#$30#$8C#$30#$6F#$30#$5E#$97#$38#$5E#$6B#$30#$ED#$77#$44#$30#$C6#$30#$AD#$30#$B9#$30#$C8#$30#$67#$30+
       #$42#$30#$8B#$30#$02#$30#$2E#$00#$69#$00#$64#$00#$78#$00;
  movefilew('testa', testfunktion(s));
end;
Die Datei "testa" bleibt unverändert im Dateinamen.

Ich habe eine Umwandlungsfunktion (String -> WideString) versucht, in String -> pWideChar umzuschreiben, hat aber scheinbar fehlgeschlagen. Ich kenne mich als Hobbyprogrammier mit Pointern einfach nicht aus und habe sie bis zum heutigen Tag nicht gebraucht. Weiß jemand, was bei meinen oben genannten Testscript nicht korrekt ist? Mir vergeht langsam der Spaß am Programmieren...

Gruß
blackdrake

[edit=mkinzler]Umbruch in Codezeile Mfg, mkinzler[/edit]

Der_Unwissende 11. Aug 2007 09:41

Re: Unicode-Umwandlung
 
Zitat:

Zitat von blackdrake
Delphi-Quellcode:
Function testfunktion(MBString : String) : pWideChar;
var
  WcBuffer : Array[0..MAX_PATH] of WideChar;
begin
     ...
     // Auf ... zugewiesener Wert wird niemals benutzt
     Result := WCBuffer; // Result := @WCBuffer[1];
     ....
end;

Das ist schonmal eine gaaanz schlechte Idee. Du gibst den Zeiger auf einen bestimmten Speicherbereich zurück, dieser soll hier natürlich auf ein Array von WideChars zeigen. Ein solcher Zeiger ist eben nur ein Registerwort (4 Byte) groß und enthält nur die Adresse des Datums, auf das Du zeigst. Da es sich bei der Variable WcBuffer um eine lokale Variable statischer Größe handelt, wird Delphi diese Variable für Dich auf dem Stack anlegen und von dort auch entfernen, sobald der entsprechende Scope (hier die Funktion) verlassen wird.
Anders gesagt zeigst Du im Ergebnis der Funktion auf einen Speicherbereich, der gar nicht mehr gültig ist. Hier solltest Du lieber auf ein dyn. Array setzen, diese werden auf dem Heap-erzeugt, die Adresse bleibt damit global gültig. Nach der Benutzung solltest Du dann aber auch mit finalize(<dynArray>) und setLength(<dynArray>, 0) das Array explizit frei geben (schont Ressourcen). Bei der Verwendung ist dann darauf zu achten, dass Du nicht direkt die Variable übergibst, sondern dass erste Element (<dynArray>[0]).

Was den Aufruf von MultiByteToWideChar angeht, so solltest Du hier schauen, was als Ergebnis der Umwandlung zurückkommt, alle Werte ungleich 0 zeigen einen Fehler an. Zudem könnte die Konvertierung des übergebenen Strings in ein PChar etwas problematisch sein. So endet ein PChar mit einem Null-Character (#$00), dass bei Dir bereits das erste Zeichen ist. Damit dürftest Du einen leeren String umwandeln wollen, was natürlich nicht so richtig gut klappt. Du solltest also mal schauen, was überhaupt in Dein doch recht leeren String erhalten, da solltest Du dann schauen, was eigentlich in WCBuffer steht bzw. auch schon, welchen Wert Size hat.

Gruß Der Unwissende

Ydobon 11. Aug 2007 10:14

Re: Unicode-Umwandlung
 
Ich blick hier anscheinend nicht ganz durch, warum UTF-16 nach UTF-16 wandeln? Wenn ich
Delphi-Quellcode:
var s: String;
    ws: PWideChar;
   l: Integer;
begin
  s := #$53#$30#$8C#$30#$6F#$30#$5E#$97#$38#$5E#$6B#$30#$ED#$77#$44#$30#$C6#$30#$AD+
       #$30#$B9#$30#$C8#$30#$67#$30#$42#$30#$8B#$30#$02#$30#$2E#$00#$69#$00#$64#$00#$78#$00;
  ws:=PWChar(@s[1]);
  TntEdit1.Text:=ws;
bekomm ich (ohne führendes Nullbyte) これは非常に短いテキストである。.idx bzw. mit s := #$53#$30#$8C#$30#$6F#$30#$5E#$97#$38; ergibt sich (+#$00) これは非8. Soll das in etwas herauskommen? Wenn du bereits Unicode hast, dann gibt es da doch nichts mehr umzuwandeln. Wie liest du die Info2 denn aus?

Robert Marquardt 11. Aug 2007 14:57

Re: Unicode-Umwandlung
 
Die Umwandlung von einem string in einen WideString geht durch einfache Zuweisung.
Die Frage ist nun in welchem Format der Dateiname vorliegt. Kleine Anmerkung Windows versteht kein UTF-8 oder UTF-16.

marabu 11. Aug 2007 15:33

Re: Unicode-Umwandlung
 
Hallo Robert,

Zitat:

Zitat von blackdrake
... Als erstes brauche ich eine Funktion, die ANSI in Unicode umwandelt. ...

wenn Daniel die Funktion StringToWideString() so verwendet, wie er es zeigt - d.h. mit CP_ACP = 0 - dann kann er auch gleich mit einer Zuweisung arbeiten - Delphi macht dann genau das gleiche. Mich macht aber seine Erwähnung von japanischen Zeichen im Kommentar stutzig. Wenn wirklich ein SJIS-Dateiname vorliegt, dann sind die beiden Funktionen hilfreich, da die CodePage unabhängig von der aktuellen frei gewählt werden kann.

Freundliche Grüße


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:05 Uhr.
Seite 1 von 2  1 2      

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