Laden...

Auslesen von INI Files und die Umlaute

Erstellt von ImmiMax vor 16 Jahren Letzter Beitrag vor 16 Jahren 7.100 Views
I
ImmiMax Themenstarter:in
6 Beiträge seit 2008
vor 16 Jahren
Auslesen von INI Files und die Umlaute

Hi,
ich habe ein Problem an dem ich verzweifle:

Ich benutze zum Auslesen einer INI Datei die GetPrivateProfile... - Funktionen der KERNEL32.dll. (Codesnippet von mentalis.org)

Beim Auslesen von Strings bekomme ich einfach die in der INI Datei stehenden Umlaute nicht mit. Die werden durch andere seltsame Zeichenersetzt . Und da in der Ini Datei viele Pfadverweise mit Umlauten stehen, kann ich das Problem auch nicht ignorieren. Wie bekomme ich das Problem mit den verdrehten Umlauten in den Griff? Hat jemand eine Ahnung und kann mir helfen?

Folgendes habe ich versucht:

Bei DLLImport sämtliche Sets (CharSet und was sonst noch möglich und logisch erscheint) ausprobiert.

Vorm Benutzen der Funktion GetPrivateProfileString habe ich das Encoding auf Default gestellt:

 System.Text.Encoding encoding = System.Text.Encoding.Default;

Ich habe in den Debugger- und Projekteinstellungen nach Optionen der zu verwendenden Codepages untersucht und alles auf Deutsch gestellt.

Nichts hat geholfen. Nach rund 2 Stunden googlen gebe ich jetzt auf. Hab nur ich das Problem? Irgendwo habe ich einen Knoten.

Hat hier jemand eine Ahnung, wie ich mein Problem lösen kann?

Dem Spender der Lösung würde ich symbolisch die Füße küssen. 😁

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo ImmiMax,

System.Text.Encoding.Default irgendeiner Variablen zuzuweisen ändert gar nichts. Wenn dann müsstest du das Encoding der GetPrivateProfile... - Funktionen mitgeben, die aber von Encodings natürlich nichts weiß.

Kann sein, dass es an der CharSet-Angabe beim DllImport hängt.

herbivore

I
ImmiMax Themenstarter:in
6 Beiträge seit 2008
vor 16 Jahren

Da habe ich bereits alle Möglichkeiten ausprobiert (Ansi, None, Unicode, Auto). Die haben nichts geändert.

Etwas weiteres habe ich ausprobiert: Ich habe direkt im Debug-Mode die ausgewechselten Umlaute wieder zurückgesetzt in das Original (das Wort Schlüsselautomat). Das wurde postwendend wieder vom Debugger verworfen.

Das muss doch eine einfache Ursache haben (CodePage Seiten, generelle Einstellungen, ...)???

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo ImmiMax,

naja, eine einfache Ursache schon. Du versuchst eine Welt, die mit beliebigen Encodings arbeitet mit einer Welt, die nur mit zwei Varianten der Codierung (Ansi, Unicode) arbeitet, zu verbinden. Aber daraus folgt nicht unbedingt eine einfache Lösung. Mir scheint das im Gegenteil eher eine Sackgasse zu sein.

herbivore

I
ImmiMax Themenstarter:in
6 Beiträge seit 2008
vor 16 Jahren

OK, mir scheint das auch eine Sackgasse zu sein.

Ich habe trotzdem das Problem, dass ich mit Umlauten geschriebene Verzeichnisse nicht verarbeiten kann. Leider ist meine Aufgabe zwei Welten miteinander zu verknüpfen:

Die Verwendung von INI Dateien, in denen Zeichenketten mit deutschen Umlauten vorkommen, die ich zu verwenden habe. Eigentlich kann das ja gar nicht so schwer sein!

Aber hier sieht es so aus, als wenn ich aufgeben muss, weil Microsoft mit einem Wisch sämtliche alten Anwendungen ausradieren möchte (z.B. weil die Unterstützung der alten Ini Files fehlt). Oder irre ich mich da?

Eigentlich möchte ich jedoch gar keine Diskussion über das Für und Wider von Inifiles anfangen. Ich suche nur nach einer Lösung für mein Problem. Und da hänge ich leider total.

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo ImmiMax,

ich verstehe deine Kritik nicht. Es hindert dich ja keiner daran, die Ini-Datei mit .NET-Mitteln auszulesen. Das ist ja auch ganz einfach.

Wenn du das nicht selbst machen willst, gibt es fertige Unterstützung dafür. In .NET-Komponenten und C#-Snippets finden sich mindestens zwei passende Bibliotheken.

herbivore

U
1.688 Beiträge seit 2007
vor 16 Jahren

Die Verzweiflungslösung bestünde darin, per String.Replace alle "seltsamen" Zeichen wieder in Umlaute zurückzuverwandeln.

Oder Du suchst bei Google nach brauchbaren Alternativen und benutzt eben nicht GetPrivateProfile.

183 Beiträge seit 2004
vor 16 Jahren

Hallo ujr,

da es bei mit funktioniert tipp ich mal darauf, das deine Ini-Datei mit ner eigenartigen Codepage gespeichert wurde.

Keine Ahnung ob dir das weiter hilft oder du das schon probiert hast ... öffne die Datei einfach mal im Visual Studio und stell unter Datei --> Erweiterte Speicheroptionen mal was mit Unicode oder Westeuropäisch (Windows) ein.

Grüße

edit: Ich geh mal davon aus du nutzt

[DllImport("KERNEL32.DLL", EntryPoint="GetPrivateProfileStringA",  CharSet=CharSet.Ansi)]
private static extern int GetPrivateProfileString (/*[...]*/);

aus dem Codesnippet von mentalis.org.

Versuchs einfach mal mit:

[DllImport("KERNEL32.DLL")]
private static extern int GetPrivateProfileString (/*[...]*/);

So einfach wie möglich, aber nicht einfacher. [Albert Einstein]

take a look at
* baer-torsten.de
* codinghints

U
1.688 Beiträge seit 2007
vor 16 Jahren

Hallo él toro,

vielen Dank. Allerdings bin ich nicht der OP, aber ich denke, dass Dein Vorschlag trtozdem bei ImmiMax ankommt 😉

183 Beiträge seit 2004
vor 16 Jahren

Allerdings bin ich nicht der OP Ups 8)

So einfach wie möglich, aber nicht einfacher. [Albert Einstein]

take a look at
* baer-torsten.de
* codinghints

I
ImmiMax Themenstarter:in
6 Beiträge seit 2008
vor 16 Jahren

Sorry, ich wollte keine Schärfe in die Diskussion bringen.

Die Antwort von él Toro hat mir schon ein Stück weiter geholfen. - Jubilier -Das Abspeichern des Ini-Dokumentes in Westeuropäisch (Windows) hat mir geholfen.

Leider ist diese Ini Datei ein Originaldokument vom Kunden. Jetzt brauche ich also nur noch eine Möglichkeit um sicher zu stellen, dass das Dokument auch im richtigen Format gespeichert wird.

Vielen Dank noch mal. Um Deine Füsse kümmere ich mich später 😁

Gruß ImmiMax