Delphi-PRAXiS
Seite 1 von 2  1 2      

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;


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:10 Uhr.
Seite 1 von 2  1 2      

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