Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

Türkisches i unter Windows. Bug?



  • Hallo, Qt-Spezialisten!
    Hab meine erste Qt-App (einen Vokabeltrainer) bald fertig. Habe sie unter Linux64 (Mint) entwickelt, da läuft alles problemlos. Bin nun aber bei der Portierung auf Windows auf folgendes Problem gestoßen: Bei der Anwendung von toUpper() auf einen QString mit türkischen Buchstaben ist mir aufgefallen, dass da ein Buchstabe, nämlich das i, nicht richtig in den Großbuchstaben konvertiert wird. Testcode:

    QString str = QLocale("tr_TR").toUpper("şçği");
    QMessageBox msgBox;
    msgBox.setText(str);
    msgBox.exec();
    

    Wie man sieht, enthält der String nur die für das Türkische typischen Buchstaben ş, ç, ğ, i. Die ersten drei werden auch richtig in Großbuchstaben verwandelt (Ş, Ç, Ğ), nur beim i klappt es nicht. Dieses sollte im Türkischen auch beim Großbuchstaben einen Punkt haben, also als İ erscheinen. Stattdessen erscheint I, wie wir es von Deutschen her kennen. Im Türkischen gibt es aber zwei i's, eines mit Punkt und eines ohne, groß wie klein, also i İ und ı I. Und diese zu unterscheiden ist extrem wichtig! (S. z.B. hier, was passieren kann, wenn man die Punkte nicht richtig setzt: https://gizmodo.com/a-cellphones-missing-dot-kills-two-people-puts-three-m-382026)
    Das Problem tritt wie gesagt nur unter Windows auf. Ein Bug? Sollte aber doch eigentlich leicht zu beheben sein, denn unter Linux funktioniert es ja auch. (Auf Linux und Win läuft Qt 5.14.)


  • Moderators

    hi @Helmut-W

    Frage, weil ich mit türkisch nicht auskenne, wie würde ein Mensch unterscheiden, ob es sich um ein I oder ein İ handelt ?

    oder ist is prinzipiell so dass i mit Punkt wird ein I mit Punkt und i ohne Punkt wird i ohne Punkt ?



  • Hi @J-Hilk
    Letzteres ist der Fall, ein i ohne Punkt (ı) ist im Türkischen ein anderer Buchstabe (und auch ein anderer Laut) als ein i mit Punkt (i). Beide haben einen eigenen Platz im türkischen Alphabet. Und wenn man toUpper() auf diese Buchstaben anwendet, sollte auch jeweils ein großes i ohne Punkt (I) bzw. mit Punkt (İ) herauskommen. Unter Linux klappt das auch (wenn man die Locale berücksichtigt, was ich getan habe), unter Windows leider nicht. Wie es auf einem Mac ausschaut, konnte ich noch nicht ausprobieren.


  • Moderators

    @Helmut-W erstaunlicher weise für MACos sieht es so aus:

    qDebug() << QLocale("tr_TR").toUpper("şçği");
    qDebug() << QLocale("tr_TR").toLower("İ");
    qDebug() << QLocale("tr_TR").toUpper(QLocale("tr_TR").toLower("İ"));
    
    -----
    
    "ŞÇĞI"
    "i̇"
    "İ"
    

    i̇ sieht aber anders aus als i, und ist auch ein anderes Zeichen. Sieht aus als würde Qt i zu I und i̇ zu İ machen.

    Wenn sich die Sprache so verhält wie du sagst, sieht mir nach nem Bug aus, ich würde es Reporten unter:
    https://bugreports.qt.io

    Kannst ja dann auch einen Link hier posten, damit man das mitverfolgen kann 😉



  • @J-Hilk Danke für die Rückmeldung zu MacOS! Also dort gleich wie unter Windows.
    Interessant ist aber folgendes: "i̇ sieht aber anders aus als i, und ist auch ein anderes Zeichen." Habe mal dieses i aus Deinem Post untersucht: Es besteht aus zwei Zeichen: U+0069 und U+0307. Erstes ist das normale kleine i, das U+0307 ist ein kombinierender Punkt oberhalb. Wenn dann das kleine i in ein großes I verwandelt wird und der kombinierende Punkt oben erhalten bleibt, stimmt die Sache wieder. Schön ist aber was anders. :-)

    Soweit ich weiß, gibt es nur ein Unicode-Zeichen "Latin Small Letter I", nämlich auf Position U+0069. Und dieses sollte durch toUpper() zu "Latin Capital Letter I with Dot Above" (U+0130) werden, wenn die Locale Türkisch verwendet wird, was unter Linux, aber nicht unter Win und offenbar auch nicht unter Mac funktioniert.

    Für den Bugreport muss ich mich erst einlesen, das scheint eine aufwendige Sache zu sein, da kann man nicht mal so einfach was posten. Inzwischen behelfe ich mir durch den Workaround

    turkishword.replace("i", "İ");
    turkishword = QLocale("tr_TR").toUpper(turkishword);

Log in to reply