Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi WritePrivateProfileW und Unicode INI-Files (https://www.delphipraxis.net/143304-writeprivateprofilew-und-unicode-ini-files.html)

martinf16 13. Nov 2009 04:52


WritePrivateProfileW und Unicode INI-Files
 
Ich versuche einen Unicode-String in ein INI-File zu schreiben. Die Unit TIniFiles hab ich entsprechend auf WideStrings umgestellt, jedoch bereitet eine Stelle Probleme:

Delphi-Quellcode:
WritePrivateProfile
Ich habe diese Funktion mit WritePrivateProfileW ausgetauscht, um WideStrings schreiben zu können, trotzdem tauchen aber die Fragezeichen auf, es wird als ANSI gespeichert.

In diversen C++ Foren hab ich dann gelesen, dass diese Funktion ein ANSI File erstellt und nur in ein vorhandens INI-File Unicode schreibt. Also hab ich um es auszutesten eine UTF8 Datei erstellt und mit WritePrivateProfileW in diese Datei gespeichert - wieder nur Fragezeichen, also wieder nur ANSI geschrieben.

Jetzt komm ich nicht mehr weiter.... Wisst ihr was los ist?!?!

PS: Ich habe schon getesten ob der WideString nicht auf dem Weg zur Funktion verlorengeht, das kann nicht der Fehler sein.

himitsu 13. Nov 2009 06:47

Re: WritePrivateProfileW und Unicode INI-Files
 
Hier im Forum suchenunicode ini

Kurz gesagt:
Wurde die INI-Datei mit einer Ansi-Funktion erstellt, dann ist und bleibt sie ANSI.
Und mit'm Unicode isses andersrum.

Nicht alles glauben, was die C++-ler einen einreden wollen. :angel2:

Stevie 13. Nov 2009 07:21

Re: WritePrivateProfileW und Unicode INI-Files
 
Zitat:

Zitat von himitsu
Nicht alles glauben, was die C++-ler einen einreden wollen. :angel2:

Lies mal den letzten Satz unter Parameters: WritePrivateProfileString

Nur was einem dort keiner sagt, ist, dass die Datei UTF16 sein muss, damit das klappt.

himitsu 13. Nov 2009 07:35

Re: WritePrivateProfileW und Unicode INI-Files
 
Du meinst?
Zitat:

If the file was created using Unicode characters, the function writes Unicode characters to the file. Otherwise, the function writes ANSI characters.
Und das für Windows Unicode = UTF-16 ist, daß ist ja wohl selbstverständlich :-D

Bernhard Geyer 13. Nov 2009 07:39

Re: WritePrivateProfileW und Unicode INI-Files
 
Zitat:

Zitat von himitsu
Und das für Windows Unicode = UTF-16, daß ist ja wohl selbstverständlich :-D

Nicht unbedingt. Aber ich vermute das die WriteXXX-Methoden nicht erkennen das es einen UTF8-BOM gibt und diesen überlesen (Als "komische" Daten im File ansehen). Erst bei UTF-16 müssen die Lese/Schreibroutinen auf Widechars umgestellt werden da sonst die (vermutlich C/C++)-Implementierung sonst die Strings nicht auslesen könnte. Bei UTF8 kann man auch mit Ansichars lesen/schreiben.

Stevie 13. Nov 2009 07:59

Re: WritePrivateProfileW und Unicode INI-Files
 
Zitat:

Zitat von himitsu
Und das für Windows Unicode = UTF-16 ist, daß ist ja wohl selbstverständlich :-D

Scheinbar nicht :wink:
Zitat:

Zitat von martinf16
Also hab ich um es auszutesten eine UTF8 Datei erstellt und mit WritePrivateProfileW in diese Datei gespeichert - wieder nur Fragezeichen, also wieder nur ANSI geschrieben.


himitsu 13. Nov 2009 08:20

Re: WritePrivateProfileW und Unicode INI-Files
 
Wenn ich das richtig mitbekomman hab, dann wird nur das Unicode-BOM (UTF-16) erkannt und alles andere ist Ansi, wobei das BOM dann als Text angesehn wird.

martinf16 13. Nov 2009 14:01

Re: WritePrivateProfileW und Unicode INI-Files
 
Gut, danke schon mal. Das könnte die Ursache sein.. UTF8 wird nicht als Unicode erkannt, UTF16 ist gefordert.

Die bisher verwendete Signatur für UTF8 von mir war EF BB BF, wie ist diese aber bei dem unterstützen vom Windows unterstützten UTF16? FE FF für Big Endian oder FF FE für Little Endian habe ich im Netz gefunden.. Ist das egal welche man nimmt?

Bernhard Geyer 13. Nov 2009 14:07

Re: WritePrivateProfileW und Unicode INI-Files
 
Zitat:

Zitat von martinf16
FE FF für Big Endian oder FF FE für Little Endian habe ich im Netz gefunden.. Ist das egal welche man nimmt?

Probiers doch aus. Normalerweise ist es egal, außer hier wurde auch noch geschlampt und nur eine implementiert.

martinf16 13. Nov 2009 15:01

Re: WritePrivateProfileW und Unicode INI-Files
 
Ich habs mit beiden Signaturen ausprobiert und jetzt ist zu viel des guten passiert: Die ganze Datei (geöffnet im TextEditor) besteht nur noch aus chinesischen Zeichen und kann dementsprechend auch nicht mehr eingelesen werden...

Hab dann mal versucht manuell in die Datei zu schreiben (unterer Teil), aber auch das produziert die chinesischen Zeichen... Wie kann das denn passieren?!

Hier mein Code:

Delphi-Quellcode:
var
  f: file;
  ftxt: TextFile;
  fsig: array [0..2] of byte;
begin
  fsig[0]:=$FF;
  fsig[1]:=$FE;
  try
    AssignFile(f, 'text.txt');
    ReWrite(f, 1);
    BlockWrite(f, fsig, sizeof(fsig));
  finally
    CloseFile(f);
  end;

  //zu Testzwecken hier das manuelle Schreiben
  try
    AssignFile(ftxt, 'text.txt');
    Append(ftxt);
    Writeln('blabla');
  finally
    CloseFIle(ftxt);
  end;
end;

Bernhard Geyer 13. Nov 2009 15:37

Re: WritePrivateProfileW und Unicode INI-Files
 
Writeln dürfte in deiner Delphi-Version nix mit Unicode anzufangen wissen.

martinf16 13. Nov 2009 15:53

Re: WritePrivateProfileW und Unicode INI-Files
 
Das WriteLn soll auch gar keien UniCode Strings schreiben. Die Unicode Strings sollen später mit WritePrivateProfileW geschrieben werden.
Das WriteLn war nur ein Test, ob damit auch chinesische Zeichen geschrieben werden und so geschieht es auch.
Die Signatur scheint aber korrekt zu sein, zumindest wird die Datei im Editor als Unicode angezeigt und die chinesischen Zeichen sprechen ja auch dafür. Wieso lassen sich aber nun mit WritePrivateProfileW keine lateinischen Buchstaben mehr schreiben??

himitsu 13. Nov 2009 16:32

Re: WritePrivateProfileW und Unicode INI-Files
 
Wenn du eine AnsiIni hast, dann mit Notepad öffnen und als Unicode speichern.
Wenn keine vorhanden ist, dann einfach die Unicode-IniAPI nutzen und eine Unicode-Ini erstellen.

martinf16 13. Nov 2009 17:30

Re: WritePrivateProfileW und Unicode INI-Files
 
Die ini sollte vom Programm schon selber erstellt werden, deswegen ja die Idee eine leere Datei mit Unicode-Signatur zu erstellen. Aber woher bekomme ich diese Unicode IniAPI?! Oder wie rufe ich sie auf? Davon habe ich noch nichts gehört..

martinf16 16. Nov 2009 02:13

Re: WritePrivateProfileW und Unicode INI-Files
 
Ich habs! Es geht tatsächlich mit der Signatur FF FE - mein Fehler oben war ein Byte zu viel zu schreiben (die einfachsten Dinge übersieht man ja gerne) - wenn man das korrigiert und anschließend mit WritePrivateProfileW in die Datei schreibt, werden alle Unicode-Zeichen richtig in die Datei geschrieben.

kuba 31. Okt 2011 15:58

AW: WritePrivateProfileW und Unicode INI-Files
 
auch wenns schon ein Weilchen her ist, ich habs so gemacht...

Delphi-Quellcode:
   
procedure CreateIni;
var
  Ini      : TMemIniFile;
begin
   Ini := TMemIniFile.Create(ExtractFilePath(ParamStr(0))+'test.ini', TEncoding.Unicode);
///// Russisch
   ini.WriteString('Language_ru','File1','файл');
   ini.UpdateFile;
end;
kuba


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