Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi TIniFile speichert manchmal UTF8 statt ANSI (https://www.delphipraxis.net/215307-tinifile-speichert-manchmal-utf8-statt-ansi.html)

haentschman 11. Jun 2024 09:11

Delphi-Version: 12 Athens

TIniFile speichert manchmal UTF8 statt ANSI
 
Liste der Anhänge anzeigen (Anzahl: 3)
Hallöle...8-)

Vieleicht habe ich es noch nicht bemerkt und es ist schon immer so...:zwinker:

Ich habe eine TIniFile wo das letzte Layout (Name) gespeichert ist. Beim Start holt sich die Anwendung das letzte Layout und zeigt es an. Beim Beenden wird das letzte Layout über die Ini gespeichert.

Seit einiger Zeit, am Quellcode ist für das Laden/Speichern nichts geändert worden, kann die Anwendung das Layout nicht laden.

Analyse:
* Die Ini Datei ist manchmal UTF8, manchmal ANSI...wieso? Ich tippe darauf, daß der Pfad zum Layout nicht richtig umgewandelt wird und der Pfad ungültig ist. :cry:
* Ändere ich das Layout manuell, wird das Layout (mit Umlauten) nicht geladen. (Bild3)

Frage:
* Hat sich bei TIniFile von D11.2 zu D12 etwas geändert?
* Früher war TIniFile ausschließlich ANSI?
* wenn der Pfad "_Default" oder den Unterstrich enthällt wird die Datei zu UTF8. Den Unterstrich gibt aber im ANSI? (#95)

Könnte mir das mal jemand erklären? :wink:

Danke...

PS:
Ich habe auch TMemIniFile ausprobiert. Mußte ich gleich wieder zurücknehmen... Fehler auf verschiedenen Systemen (nicht alle): "Keine Zuordnung für Unicode-Zeichen in der Multibyte-Zielcodeseite vorhanden"

Klaus01 11. Jun 2024 09:27

AW: TIni speichert manchmal UTF8 statt ANSI
 
.. auch ersten Bild sind im Pfad "_" vorhanden (_Layout) - das ini ist da aber weiterhin im ANSI Format.
Ob es an den "_" liegt wage ich daher zu bezweifeln.

Grüße
Klaus

uligerhardt 11. Jun 2024 09:33

AW: TIni speichert manchmal UTF8 statt ANSI
 
Ist vielleicht interessant: Can INI files be Unicode? Yes, they can, but it has to be your idea

himitsu 11. Jun 2024 09:51

AW: TIni speichert manchmal UTF8 statt ANSI
 
welches TIni?
TMemIniFile, TIniFile, ...

Wo? (Windows)

Und ist es wirklich UTF-8?
Es soll UTF-8 ohne BOM sein und im Bereich von ASCII (#0-#127) sind ANSI und UTF-8 identisch.


TIniFile definitiv nicht, denn die WinAPI kann ausschließlich ANSI und UTF-16 (Unicode).
Aber eine "Erkennung" könnte es ohne BOM teilweise für UTF-8 halten, obwohl es ANSI ist, z.B. wenn keine Umlaute (Ä) drin vorkommen.

Gausi 11. Jun 2024 10:01

AW: TIni speichert manchmal UTF8 statt ANSI
 
Wird die Datei wirklich zu UTF bzw. Ansi oder umgekehrt, oder sagt nur die Heuristik von Notepad++, dass das so sei? Sieht man in einem HexEditor ein BOM, oder fängt das direkt mit den Textdaten an?

TIniFile basiert meines Wissens nach immer noch auf der Windows-API, die nur ANSI kann, was dann zu Problemen mit Umlauten führen kann. TMemIniFile ist eine eigene Delphi-Implementierung, die auf TStringList basiert, und die dann entsprechend verschiedene Kodierungen kann.
Dein Fehler bei der Umstellung auf TMemInifile dürfte auch auf den Umlaut zurückzuführen sein. Wenn der als ANSI codiert ist (also ein Byte), aber TMemInifile versucht, die Datei als UTF-8 zu interpretieren (da bräuchte ein "ä" zwei Byte), geht das halt schief. Abhilfe: Bein Create (oder beim Lesen?) explizit die Text-Kodierung angeben, und nciht auf den Standard (iirc UTF-8) vertrauen.

Uwe Raabe 11. Jun 2024 10:31

AW: TIni speichert manchmal UTF8 statt ANSI
 
Zitat:

Zitat von himitsu (Beitrag 1537621)
welches TIni?

Das wäre auch meine Frage. Eine Klasse TIni ist in Delphi erstmal nicht bekannt.

Zitat:

Zitat von haentschman (Beitrag 1537618)
Ich habe auch TMemIniFile ausprobiert. Mußte ich gleich wieder zurücknehmen... Fehler auf verschiedenen Systemen (nicht alle): "Keine Zuordnung für Unicode-Zeichen in der Multibyte-Zielcodeseite vorhanden"

Eigentlich ist TMemInifile die perfekte Wahl, wenn man es denn auch mit einem dedizierten UTF8-Encoding erzeugt. Das kann aber halt auch bedeuten, dass eventuell existierende Dateien erst einmal konvertiert werden müssen.

Das gemeine ist halt, dass das Default-Encoding unter Windows ANSI ist, sonst aber UTF8. Deswegen würde ich sowas immer explizit festlegen und gegebenenfalls die Dateibestände normalisieren.

haentschman 11. Jun 2024 10:34

AW: TIni speichert manchmal UTF8 statt ANSI
 
Zitat:

Ich habe auch TMemIniFile ausprobiert. Mußte ich gleich wieder zurücknehmen...
...wir reden über TIniFile. :zwinker:
Zitat:

gegebenenfalls die Dateibestände normalisieren.
...davor habe ich Angst. :roll: Es sind verschiede Versionen unterwegs. Wann machen die das Update? Wenn sie wollen. Die alte Version "überspeichert" die manuell in UTF8 mit BOM geänderte Datei. :?

Gausi 11. Jun 2024 10:49

AW: TIniFile speichert manchmal UTF8 statt ANSI
 
Für das (nicht abwärtskompatible) Update: Benutze in der neuen Version einen anderen Dateinamen für die Ini. Wenn beim Laden die neue Datei da ist, wird diese mit der neuen Lade-Routine geladen. Ansonsten Fallback auf die alte Methode mit der alten Datei.
Beim Speichern ggf. die alte Datei löschen.

DeddyH 11. Jun 2024 11:06

AW: TIniFile speichert manchmal UTF8 statt ANSI
 
Zitat:

Zitat von Gausi (Beitrag 1537627)
Für das (nicht abwärtskompatible) Update: Benutze in der neuen Version einen anderen Dateinamen für die Ini. Wenn beim Laden die neue Datei da ist, wird diese mit der neuen Lade-Routine geladen. Ansonsten Fallback auf die alte Methode mit der alten Datei.
Beim Speichern ggf. die alte Datei löschen.

:thumb: So mache ich das auch immer, wenn sich bei mir mal ein Dateiformat ändert.

Redeemer 11. Jun 2024 14:53

AW: TIni speichert manchmal UTF8 statt ANSI
 
Zitat:

Zitat von himitsu (Beitrag 1537621)
Und ist es wirklich UTF-8?
Es soll UTF-8 ohne BOM sein und im Bereich von ASCII (#0-#127) sind ANSI und UTF-8 identisch.


TIniFile definitiv nicht, denn die WinAPI kann ausschließlich ANSI und UTF-16 (Unicode).

Das hier möchte ich nochmal betonen. Denn das ist meiner Meinung nach wichtig.

Uwe Raabe 11. Jun 2024 14:57

AW: TIniFile speichert manchmal UTF8 statt ANSI
 
Das Verhalten von TIniFile bzw. der dahinter liegenden WritePrivateProfileString Funktion ist in der Tat schwer zu durchschauen.

Zum Einen wird Unicode geschrieben, wenn die Datei schon als Unicode Datei vorliegt, andernfalls ANSI:
https://learn.microsoft.com/en-us/wi...profilestringa
Zitat:

If the file was created using Unicode characters, the function writes Unicode characters to the file. Otherwise, the function writes ANSI characters.
Dazu kommt dann noch eine etwas versteckt liegende Windows-Option, die anstatt ANSI dann netterweise UTF8 schreibt:
https://en.wikipedia.org/wiki/Unicod...rosoft_Windows
Zitat:

In April 2018 (or possibly November 2017[13]), with insider build 17035 (nominal build 17134) for Windows 10, a "Beta: Use Unicode UTF-8 for worldwide language support" checkbox appeared for setting the locale code page to UTF-8.[a] This allows for calling "narrow" functions, including fopen and SetWindowTextA, with UTF-8 strings. However this is a system-wide setting and a program cannot assume it is set.
https://learn.microsoft.com/en-us/wi...utf8-code-page
Zitat:

-A vs. -W APIs
Win32 APIs often support both -A and -W variants.

-A variants recognize the ANSI code page configured on the system and support char*, while -W variants operate in UTF-16 and support WCHAR.

Until recently, Windows has emphasized "Unicode" -W variants over -A APIs. However, recent releases have used the ANSI code page and -A APIs as a means to introduce UTF-8 support to apps. If the ANSI code page is configured for UTF-8, then -A APIs typically operate in UTF-8. This model has the benefit of supporting existing code built with -A APIs without any code changes.

Nur so am Rande:
https://learn.microsoft.com/en-us/wi...profilestringa
Zitat:

Note This function is provided only for compatibility with 16-bit versions of Windows. Applications should store initialization information in the registry.

haentschman 12. Jun 2024 08:16

AW: TIniFile speichert manchmal UTF8 statt ANSI
 
Danke für die Informationen...:wink:

Ich habe mich entschieden für TMemIniFile mit TEncoding.UTF8. :wink:
Wenn eine ANSI Datei mit enthaltenen Umlauten geladen werden soll kommt "Keine Zuordnung für Unicode-Zeichen in der Multibyte-Zielcodeseite vorhanden". Dann müssen sie bei mir anrufen und ich ändere die Datei manuell auf UTF8-BOM. :thumb: Das ist einfacher als das auszuprogrammieren...

Frickler 13. Jun 2024 17:49

AW: TIniFile speichert manchmal UTF8 statt ANSI
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1537635)
Dazu kommt dann noch eine etwas versteckt liegende Windows-Option, die anstatt ANSI dann netterweise UTF8 schreibt:
https://en.wikipedia.org/wiki/Unicod...rosoft_Windows
Zitat:

In April 2018 (or possibly November 2017[13]), with insider build 17035 (nominal build 17134) for Windows 10, a "Beta: Use Unicode UTF-8 for worldwide language support" checkbox appeared for setting the locale code page to UTF-8.[a] This allows for calling "narrow" functions, including fopen and SetWindowTextA, with UTF-8 strings. However this is a system-wide setting and a program cannot assume it is set.

Manche OEMs aktivieren diese Option, ohne das zu kommunizieren. Wir hatten das bei Kunden-PCs von HP und Dell, die mit Windows 10 Pro ausgeliefert wurden. Datenbankeinträge waren plötzlich unlesbar, aber nur, wenn sie auf bestimmten PCs vorgenommen wurden. War ein Heidenspaß, die Fehlerursache zu finden...

himitsu 13. Jun 2024 20:06

AW: TIniFile speichert manchmal UTF8 statt ANSI
 
Zitat:

Spaß
Party :party:


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:11 Uhr.

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