Kylix - Umlautbehandlung in Form und Source
-
Hallo,
ich habe ein Programm geschrieben, das z.B. auch auf Linux-Systemen läuft, bei denen scheinbar keine deutschen Zeichensätze unter X vorhanden sind. Das zeigt sich unter Anderem daran, das bei irgendwelchen Textausgaben die Umlaute als Fragezeichen dargestellt werden. Leider habe ich nicht immer Zugriff aus die Systeme, so daß ich an denen nix ändern kann.
Seltsamerweise passiert das aber nur, wenn ich zum Beispiel ein Label dynamisch mit Text versehe. Schreibe ich den gleichen Text im Objektinspector ins Label, zeigt das Programm zur Laufzeit die Umlaute korrekt an.
Also:
Label1, Caption dynamisch im Sourcecode zugewiesen, Umlaut wird zum Fragezeichen.
Label2, Caption im OI zugewiesen, Umlaut wird korrekt angezeigt.Ich habe also in das XFM-File vom Formular geschaut und gesehen, daß Kylix die Umlaute als ASCII-wert im Formular speichert.
Also wollte ich die dynamischen Texte ebenso ausgeben, z.B.:
Label1->Caption="Das f"+(AnsiString)(char)252+"hrt zu nichts";
Damit sollte "Das führt zu nichts" angezeigt werden. Trotzdem wird mir "Das f?hrt zu nichts" angezeigt. Wieso funktioniert das nicht? Woher nimmt Kylix die Umlaute, wenn sie schon im Objektinspector eingegeben werden?
mfG, Jens
-
So, im Usenet habe ich einen Lösungsansatz gefunden, den ich Euch nicht vorenthalten will. Dieser Ansatz stammt von Andreas Hausladen, der auch die Seite http://www.kylix-patch.de.vu/ betreibt. Der Code darin ist zwar Delphi, aber sollte auch in C/C++ umsetzbar sein.
The object inspector can uses WideString for the strings because they are
defined as WideString:
property Caption: WideString ...In your code all strings are Ansi-Strings that are automatically (compiler
magic) converted to a unicode string. But this process is system dependend
and so your umlaute are converted to wrong characters. This is also the
reason for the problem with the ANSI codes of the chars. They are
converted, too.
A possible solution is to write the strings in English and use the
dxgettext (dxgettext.sourceforge.net) tool for Kylix to translate them.
The tool uses unicode. Another solution would be a translation table.type TConvTblItem = record Ansi: Char; Wide: WideChar; end; const UmlauteConvTbl: array[0..6] of TConvTblItem = ( (Ansi: 'ß'; Wide: WideChar($00DF)), (Ansi: 'ä'; Wide: WideChar($00E4)), (Ansi: 'ö'; Wide: WideChar($00F6)), (Ansi: 'ü'; Wide: WideChar($00FC)), (Ansi: 'Ä'; Wide: WideChar($00C4)), (Ansi: 'Ö'; Wide: WideChar($00D6)), (Ansi: 'Ü'; Wide: WideChar($00DC)) ); function _(S: AnsiString): WideString; var i, Idx: Integer; begin // convert to unicode Result := S; // adjust umlaute for i := 1 to Length(Result) do for Idx := 0 to High(UmlauteConvTbl) do if S[i] = UmlauteConvTbl[Idx].Ansi then // compare ANSI (not the WIDE) chars Result[i] := UmlauteConvTbl[Idx].Wide; end; ShowMessage(_('ÄÖÜ äöü ß - Änderungen würden gelöscht werden'));
mfG, Jens
-
Danke, kommt in die FAQ.