INI - Datei Umlaute [gelöst]

Für Fragen von Einsteigern und Programmieranfängern...
Cool-Tuc
Beiträge: 100
Registriert: Mi 6. Apr 2011, 17:10

INI - Datei Umlaute [gelöst]

Beitrag von Cool-Tuc »

Hallo,

ich verwende die Version 1.4.4 (FPC 2.6.4) u.A. unter Windows. Hier versuche ich Sections aus einer INI-Datei auszulesen, die umlaute beinhalten. Also z.B.

Code: Alles auswählen

INIFile.ReadInteger('Süden', 'Pos', 0);
Der Eintrag lautet z.B. Pos=34
Es kommt aber 0 zurück, da vermutlich die Section mit dem Umlaut nicht erkannt wird. Ich habe auch schon folgenden Aufruf versucht:

Code: Alles auswählen

INIFile.ReadInteger(AnsiToUtf8('Süden'), 'Pos', 0);
Auch hier bekomme ich nicht das erwartete Ergebnis...

Kann jemand helfen?

danke

udo
Zuletzt geändert von Cool-Tuc am Do 11. Feb 2016, 21:16, insgesamt 1-mal geändert.

wp_xyz
Beiträge: 5265
Registriert: Fr 8. Apr 2011, 09:01

Re: INI - Datei Umlaute

Beitrag von wp_xyz »

Windows kann immer bedeuten: Widestrings. Daher versuch's mal mit UTF8Encode bzw UTF8Decode (ich weiß nie, welches von beiden von Wide nach UTF8 umwandelt und welches umgekehrt...).

Mathias
Beiträge: 7026
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: INI - Datei Umlaute

Beitrag von Mathias »

Ich habe es gerade probiert, bei mir klappt es, ohne irgendwelche UTF8-Umwandlungen, sowohl unter Linux und Windows.

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
var
  ini: TIniFile;
begin
  ini := TIniFile.Create('test.ini');
  ini.WriteString('äää', 'öäü', Edit1.Caption);
  ini.Free;
end;
 
procedure TForm1.Button2Click(Sender: TObject);
var
  ini: TIniFile;
begin
  ini := TIniFile.Create('test.ini');
  Edit1.Caption:=ini.ReadString('äää', 'öäü', 'default');
  ini.Free;
end;  
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

wp_xyz
Beiträge: 5265
Registriert: Fr 8. Apr 2011, 09:01

Re: INI - Datei Umlaute

Beitrag von wp_xyz »

Mathias hat geschrieben:Ich habe es gerade probiert, bei mir klappt es, ohne irgendwelche UTF8-Umwandlungen, sowohl unter Linux und Windows.
Dann hast du fpc 3.0?

Cool-Tuc
Beiträge: 100
Registriert: Mi 6. Apr 2011, 17:10

Re: INI - Datei Umlaute

Beitrag von Cool-Tuc »

...ich lese zu Begin alle Sections mit "ReadSections" in eine "TStringList" ein.
Aber schon hier stehen Sonderzeichen, die ich allerdings mit "UTF8Decode" umwandeln kann. Aber die Abfrage mit "INIFile.ReadInteger(UTF8Decode(sTemp1), 'Pos', 0); " funktioniert einfach nicht.
Ich muss allerdings dabei sagen, dass ich diese INI-Datei mit dem normalen editor unter Windows erstellt habe, und nicht über das Programm.
Erstelle ich die INI-Datei unter linux (mit gedit) wird die 1-te Section unter windows überhaupt nicht gelesen, sie wird einfach übersprungen als wäre sie nicht da; aber das ist ein anderes Problem...

Udo

Mathias
Beiträge: 7026
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: INI - Datei Umlaute

Beitrag von Mathias »

Probiere mal UTF8ToSys und SysToUTF8, man wiess ja nie.

Dann hast du fpc 3.0?
Habe ich.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Cool-Tuc
Beiträge: 100
Registriert: Mi 6. Apr 2011, 17:10

Re: INI - Datei Umlaute

Beitrag von Cool-Tuc »

Sorry,

keine Chance, es scheint ein wahrloses Durcheinander zu sein....es klappt mit keiner der genannten Einstellungen...egal, überleg ich mir etwas anderes...

Udo

wp_xyz
Beiträge: 5265
Registriert: Fr 8. Apr 2011, 09:01

Re: INI - Datei Umlaute

Beitrag von wp_xyz »

Kannst du vielleicht die Ini-Datei hier hochladen?

Cool-Tuc
Beiträge: 100
Registriert: Mi 6. Apr 2011, 17:10

Re: INI - Datei Umlaute

Beitrag von Cool-Tuc »

OK,

hier mal eine test.ini.

Fange ich mal vorne an. Ich lese alle Sections mit "INITest.ReadSections(sSections);" ein. (sSections ist eine TStringList) Das erste grundsätzliche Problem: die erste Section wird nicht erkannt, also nicht eingelesen...egal was dort steht...und dann bin ich noch nicht bei den Umlauten..

Udo

Ups. der Anhang ist nicht vorhanden, also der Inhalt:

[Auto]
Räder=4

[Zweirad]
Räder=2

[Dreirad]
Räder=3
Dateianhänge
test.zip
TestDatei - umbenennen in test.ini
(67 Bytes) 97-mal heruntergeladen
Zuletzt geändert von Cool-Tuc am Do 11. Feb 2016, 18:17, insgesamt 1-mal geändert.

wp_xyz
Beiträge: 5265
Registriert: Fr 8. Apr 2011, 09:01

Re: INI - Datei Umlaute

Beitrag von wp_xyz »

Nein, sowas könnte ich mir ja selber machen. Ich brauche schon die Datei konkret, die dir Probleme macht. Falls die Forumsoftware keine ini-Dateien akzeptiert, packe sie in ein zip.

Cool-Tuc
Beiträge: 100
Registriert: Mi 6. Apr 2011, 17:10

Re: INI - Datei Umlaute

Beitrag von Cool-Tuc »

...der Dateianhang hat jetzt funktioniert, siehe mein letzter Beitrag...

wp_xyz
Beiträge: 5265
Registriert: Fr 8. Apr 2011, 09:01

Re: INI - Datei Umlaute

Beitrag von wp_xyz »

Wenn du die Datei in Notepad++ lädst, siehst du rechts unten, dass es sich um eine UTF8-Codierung mit BOM handelt (BOM = Byte-Order-marker). Am einfachsten berücksichtigst du das, wenn du zum Erzeugen der Ini-Datei nicht die Methode mit dem Dateinamen, sondern die mit einem Stream nimmst; damit kannst du alles bis zur ersten öffnenden Klammer überlesen und den Rest direkt an die TIniFile übergeben:

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
var
  ini: TCustomIniFile;
  stream: TStream;
  sections: TStrings;
  ch: AnsiChar;
begin
  stream := TFileStream.create('test.ini', fmOpenRead);
  try
    // Alles vor der ersten Klammer '[' überlesen
    repeat
      ch := char(stream.ReadByte);
    until (ch = '[');
    Stream.Position := Stream.Position - 1;
    // Der Stream steht nun am Beginn der eigentlichen ini-Datei
    ini := TIniFile.Create(stream);
    try
      sections := TStringList.Create;
      ini.ReadSections(sections);
      Memo1.Lines.Assign(sections);
      Label1.Caption := IntToStr(ini.ReadInteger('Zweirad', 'Räder', 0));
    finally
      sections.Free;
      ini.Free;
    end;
  finally
    stream.Free;
  end;
end;   
[EDIT]
Oder du wechselst zu Lazarus 1.6, da wird der BOM automatisch berücksichtigt.

Mathias
Beiträge: 7026
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: INI - Datei Umlaute

Beitrag von Mathias »

Oder du wechselst zu Lazarus 1.6, da wird der BOM automatisch berücksichtigt.
Das würde ich auch machen, da ist FPC 3.0 dabei.
Wieso sich mit dem alten Zeugs rum ärgern, wen man es einfacher haben kann. :wink:
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Cool-Tuc
Beiträge: 100
Registriert: Mi 6. Apr 2011, 17:10

Re: INI - Datei Umlaute

Beitrag von Cool-Tuc »

Danke an alle,

ich habe auf 1.6 / 3.0 gewechselt und es scheint alles sauber zu funktionieren, selbst das umbenenne von Dateinamen (mit Umlaute) ohne irgendwelche UTF8....

udo

PS: Wie setze ich diesen Beitrag nun auf gelöst :?

wp_xyz
Beiträge: 5265
Registriert: Fr 8. Apr 2011, 09:01

Re: INI - Datei Umlaute

Beitrag von wp_xyz »

Cool-Tuc hat geschrieben:Wie setze ich diesen Beitrag nun auf gelöst :?
Indem du den Titel des ersten Beitrags editierst.

Antworten