In einer Konfig-XML-Datei stehen Bezeichnungen, die auch Umlaute enthalten können:
Code: Alles auswählen
<?xml version="1.0" encoding="utf-8"?>
<config>
<input name="Schlüssel" />
Geany meint dazu, Kodierung ist Utf-8 ohne BOM. Umlaute werden richtig dargestellt.
Diese Bezeichnungen werden jetzt von einem Programm (Datenlogger) in einen string[50] gelesen:
Code: Alles auswählen
txt := string(TDOMElement(Item[k]).GetAttribute('name'));
Der String ist als Shortstring definiert, weil er mit vielem anderen in einem Array steht. Macht aber keinen Unterschied, auch wenn ich die [50] weglasse und der String ein Ansistring ist.
Die Bezeichner werden jetzt mit WriteLn in eine reine Textdatei geschrieben. Geany meint, die Kodierung ist ISO8859-1, Umlaute werden richtig dargestellt. (Witzigerweise meint Geany zu einer anderen, auf gleiche Weise aber mit einem anderen Programm erstellten Datei, die Kodierung sei Utf-8, auch hier werden die Umlaute richtig dargestellt.)
Die Textdatei wird jetzt von einem zweiten Programm (Web-CGI) mit ReadLn eingelesen, ein bißchen HTML drumgebaut und als "content-type:text/html; charset=utf-8" als Webseite ausgegeben. Dabei werden allerdings die Umlaute falsch kodiert. Auch der Versuch, die Umlaute vor dem WriteLn mit StringReplace(txt, 'Ä', 'Ä', [rfReplaceAll]); zu wandeln scheitert daran, dass hier schon das 'Ä' nicht als solches erkannt wird.
Ich versuche gerade rauszufinden, wo meine Umlaute die falsche Kodierung bekommen. Sting ist ja eigentlich Ansistring, müsste also mit Utf-8 stimmen, Shortstring macht wie gesagt keinen Unterschied, auch das string() beim XML-Parsen hat keinen Einfluss, ohne bringt nur der Compiler eine Warnung, aber das Ergebnis ändert sich nicht.
Wie bekomme ich Umlaute bzw. Kodierungen über mehrere Dateien und Programme konsistent?
Die Programme laufen auf einem Raspberry unter Raspbian, FPC 3.0.0, Lazarus 1.6.2.