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.


Anmelden zum Antworten