AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Unicode-Umwandlung

Ein Thema von blackdrake · begonnen am 9. Aug 2007 · letzter Beitrag vom 12. Aug 2007
Antwort Antwort
Seite 1 von 2  1 2      
blackdrake

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

Unicode-Umwandlung

  Alt 9. Aug 2007, 13:57
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
Daniel Marschall
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: Unicode-Umwandlung

  Alt 9. Aug 2007, 14:04
In den ehemals kostenlosen TNTWare-Pack gibt es viele Unicode-Enabled Funktionen um mit Unicode-Dateinamen arbeiten zu können.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
blackdrake

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

Re: Unicode-Umwandlung

  Alt 9. Aug 2007, 14:09
Habe ich auch schon gesehen, jedoch möchte ich nur eine einzigste Funktion, die diese Wiederherstellung und eine vorherige Prozedur erledigt.
Daniel Marschall
  Mit Zitat antworten Zitat
blackdrake

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

Re: Unicode-Umwandlung

  Alt 11. Aug 2007, 02:29
Gibts mit Delphi keine Lösung, eine Datei mit Unicode umzubenennen?
Daniel Marschall
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#5

Re: Unicode-Umwandlung

  Alt 11. Aug 2007, 06:28
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.
  Mit Zitat antworten Zitat
blackdrake

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

Re: Unicode-Umwandlung

  Alt 11. Aug 2007, 09:13
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]
Daniel Marschall
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#7

Re: Unicode-Umwandlung

  Alt 11. Aug 2007, 09:41
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
  Mit Zitat antworten Zitat
Ydobon

Registriert seit: 3. Mär 2006
261 Beiträge
 
Delphi 11 Alexandria
 
#8

Re: Unicode-Umwandlung

  Alt 11. Aug 2007, 10:14
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?
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#9

Re: Unicode-Umwandlung

  Alt 11. Aug 2007, 14:57
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.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#10

Re: Unicode-Umwandlung

  Alt 11. Aug 2007, 15:33
Hallo Robert,

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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:07 Uhr.
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