5

Qtの文字列から発音区別符号を削除する方法。たとえば、これは次のとおりです。

QString test = QString::fromUtf8("éçàÖœ");
qDebug() << StringUtil::removeAccents(test);

出力する必要があります:

ecaOoe
4

4 に答える 4

10

Qtには、単純な組み込みソリューションはありません。ほとんどの場合に機能するはずの簡単な解決策は、文字列をループして、各文字を同等のものに置き換えることです。

QString StringUtil::diacriticLetters_;
QStringList StringUtil::noDiacriticLetters_;

QString StringUtil::removeAccents(QString s) {
    if (diacriticLetters_.isEmpty()) {
        diacriticLetters_ = QString::fromUtf8("ŠŒŽšœžŸ¥µÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýÿ");
        noDiacriticLetters_ << "S"<<"OE"<<"Z"<<"s"<<"oe"<<"z"<<"Y"<<"Y"<<"u"<<"A"<<"A"<<"A"<<"A"<<"A"<<"A"<<"AE"<<"C"<<"E"<<"E"<<"E"<<"E"<<"I"<<"I"<<"I"<<"I"<<"D"<<"N"<<"O"<<"O"<<"O"<<"O"<<"O"<<"O"<<"U"<<"U"<<"U"<<"U"<<"Y"<<"s"<<"a"<<"a"<<"a"<<"a"<<"a"<<"a"<<"ae"<<"c"<<"e"<<"e"<<"e"<<"e"<<"i"<<"i"<<"i"<<"i"<<"o"<<"n"<<"o"<<"o"<<"o"<<"o"<<"o"<<"o"<<"u"<<"u"<<"u"<<"u"<<"y"<<"y";
    }

    QString output = "";
    for (int i = 0; i < s.length(); i++) {
        QChar c = s[i];
        int dIndex = diacriticLetters_.indexOf(c);
        if (dIndex < 0) {
            output.append(c);
        } else {
            QString replacement = noDiacriticLetters_[dIndex];
            output.append(replacement);
        }
    }

    return output;
}

発音区別符号のある一部の文字は2つの単一文字に一致する可能性noDiacriticLetters_があるため、である必要があることに注意してください。QStringListœ=>oe

于 2012-12-23T08:04:10.050 に答える
4

あなたの質問は少し誤解を招きます。あなたは単に発音区別符号を削除する以上のことをしたいと思っているようです(–は発音区別符号のない合字です)。Unicode文字列をほぼ対応するASCII文字列に変換したいと思いますか?

発音区別符号の場合、分解Unicode正規化(特定のニーズに応じてNFDまたはNFKD)を実行してから、「マーク」カテゴリ(、、および)のすべての文字を削除QChar::Mark_NonSpacingできQChar::Mark_SpacingCombiningますQChar::Mark_Enclosing

他のすべて(例えば–)については、私は一般的な解決策を知りません。必要なすべての置換を含むルックアップテーブルを作成してから、検索して置換します(Laurentの回答を参照)。

于 2012-12-25T14:09:52.663 に答える
1

部分的な解決策は、特殊文字を削除するよりも、QString::normalizedを使用することです。

QString test = QString::fromUtf8("éçàÖœ");
QString stringNormalized = test.normalized (QString::NormalizationForm_KD);
stringNormalized.remove(QRegExp("[^a-zA-Z\\s]"));

ただし、これは「œ」を「oe」に変換しないため、部分的な解決策です。

于 2013-02-19T17:38:06.120 に答える
0

問題を部分的に解決する大まかな方法​​があります(アクセントだけで、「oe」などの合字はありません)。

QString title=QString::fromUtf8("éçàÖ");
qDebug("%s\n", title.toLocal8Bit().data());
于 2012-12-23T09:59:43.233 に答える