Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Delphi2009 TMemIniFile mit UTF8 Encoding (https://www.delphipraxis.net/126156-delphi2009-tmeminifile-mit-utf8-encoding.html)

Phoner 19. Dez 2008 09:06


Delphi2009 TMemIniFile mit UTF8 Encoding
 
Hallo,

ich versuche gerade mit Delphi2009 ein paar Einstellungen mittels TMemIniFile zu sichern, dabei aber die Unicode-Zeichen nicht zu verlieren. Um halbwegs kompatibel zu bleiben, wollte ich UTF8 benutzen, da "normale" Zeichen weiterhin ein Byte groß sind.
Aber egal was ich anstelle, die Ini-Datei bleibt immer ANSI.
Dabei benutze ich folgendes:
Delphi-Quellcode:
ini := TMemIniFile.Create(FileName, TEncoding.UTF8);
Aber egal, was ich bei TEncoding wähle, es hat keine Auswirkungen.

Kann mir da jemand helfen?
Vielen Dank!

Uwe Raabe 19. Dez 2008 09:39

Re: Delphi2009 TMemIniFile mit UTF8 Encoding
 
Das Encoding, das du beim Create übergibst, hat nur Auswirkungen, wenn die Datei nicht existiert. Ansonsten wird das bestehende Encoding der Datei verwendet (Bug or Feature?). Du kannst aber das Encoding über das gleichnamige Property vor dem UpdateFile noch gezielt setzen.

Delphi-Quellcode:
ini := TMemIniFile.Create(FileName, TEncoding.UTF8);
...
ini.Encoding := TEncoding.UTF8;
ini.UpdateFile;

Phoner 19. Dez 2008 10:20

Re: Delphi2009 TMemIniFile mit UTF8 Encoding
 
Das war es! Vielen Dank.

Phoner 19. Dez 2008 12:47

Re: Delphi2009 TMemIniFile mit UTF8 Encoding
 
OK, ich muss nochmal nachfragen.
Eine Ini-Datei komplett UTF8-kodiert zu speichern funktioniert - jedoch hat eine andere Applikation (die ebenfalls diese Datei ausliest) ein Problem damit, da anscheinend vor der ersten Section schon irgendwelche "sonderbaren" Zeichen sind, obwohl da eigentlich nur ein "[" steht, was doch ein Zeichen ist, welches sich bei UTF8 mit einem Byte darstellen lässt.
Was ich benötige, ist eigentlich auch nur ein bestimmter Value, welcher UTF8 kodiert sein soll. Wie wandle ich also einen Unicodestring (string) in UTF8 so um, dass ich diesen bei einem WriteString übergeben kann und in der Datei dann dieser String UTF8 kodiert ist?

himitsu 19. Dez 2008 12:54

Re: Delphi2009 TMemIniFile mit UTF8 Encoding
 
Diese sonderbaren Zeichn sind die Markierung (BOM = Byte Order Mark) dafür, daß die folgenden Daten UTF8 darstellen sollen

Wenn die andere Anwendung damit Probleme hat ... kann sie denn überhaupt eine INI in diesem Format verstehen?

Bernhard Geyer 19. Dez 2008 12:57

Re: Delphi2009 TMemIniFile mit UTF8 Encoding
 
Zitat:

Zitat von himitsu
kann sie denn überhaupt eine INI in diesem Format verstehen?

Das offizielle MS-Iniformat kann nur ANSI. Es gibt zwar Win32-API-Funktionen die ein W im Namen haben, diese schreiben aber auch nur ANSI-Inidateien.

himitsu 19. Dez 2008 12:58

Re: Delphi2009 TMemIniFile mit UTF8 Encoding
 
UnicodeToUtf8
Utf8ToUnicode
UTF8Encode
UTF8Decode

den UnicodeString in UTF8 umwandeln und dann sozusagen einfach als "ANSI" speichern ... laden dann umgekehrt


[add]
Zitat:

Zitat von Bernhard Geyer
Das offizielle MS-Iniformat kann nur ANSI. Es gibt zwar Win32-API-Funktionen die ein W im Namen haben, diese schreiben aber auch nur ANSI-Inidateien.

dann sind diese Funktionen wohl nur für Unicode-Dateinamen, aber nicht für den Inhalt :stupid:

Phoner 19. Dez 2008 13:07

Re: Delphi2009 TMemIniFile mit UTF8 Encoding
 
OK, der Hinweis zu "BOM" ist gut!
Ansonsten ist mein Verständnis von UTF8 so, dass "normale" Zeichen (<= 127) ganz normal so bleiben - es also kein Unterschied zwischen UTF8 und Ansi gibt. Erst wenn man spezielle Zeichen wie z.B. Umlaute hat, dann werden mehr als ein Byte pro Zeichen benötigt. Eine Applikation die nichts von UTF8 versteht, wird einen solchen String verarbeiten können, lediglich die Darstellung hat sich geändert. Wenn also alles bis zur finalen Nullterminierung verarbeitet wird, so gibt es kein Problem damit.

"UnicodeToUtf8 " ist deprecated und ich kann nicht compilieren.

Nun, ich werde wohl mit dieser "BOM" leben müssen und das entsprechend behandeln.

Vielen Dank!

himitsu 19. Dez 2008 13:32

Re: Delphi2009 TMemIniFile mit UTF8 Encoding
 
stimmt soweit, deine verstandene Erkenntnis :-D

und wie sieht's mit UTF8Encode/UTF8Decode aus?
(notfalls gibt's auch noch einige weiter Klassen und Funktionen, welche soeine Konvertierung hinbekommen ... siehe JEDI, DEC, ........)

Phoner 19. Dez 2008 13:57

Re: Delphi2009 TMemIniFile mit UTF8 Encoding
 
Das habe ich schon probiert.
Delphi-Quellcode:
var
  ansi: AnsiString;
...
  ansi := UTF8Encode(Name);
  ini.WriteString(Section, Key, ansi);
...
In der Datei sind Umlaute als normale Umlaute drin und eben nicht als UTF8. Ja, ich habe es mit einem Hex-Editor überprüft :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:32 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