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. 😁
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
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, ...)???
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
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.
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
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.
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
Hallo él toro,
vielen Dank. Allerdings bin ich nicht der OP, aber ich denke, dass Dein Vorschlag trtozdem bei ImmiMax ankommt 😉
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
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