Qtの文字列から発音区別符号を削除する方法。たとえば、これは次のとおりです。
QString test = QString::fromUtf8("éçàÖœ");
qDebug() << StringUtil::removeAccents(test);
出力する必要があります:
ecaOoe
Qtの文字列から発音区別符号を削除する方法。たとえば、これは次のとおりです。
QString test = QString::fromUtf8("éçàÖœ");
qDebug() << StringUtil::removeAccents(test);
出力する必要があります:
ecaOoe
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
あなたの質問は少し誤解を招きます。あなたは単に発音区別符号を削除する以上のことをしたいと思っているようです(–は発音区別符号のない合字です)。Unicode文字列をほぼ対応するASCII文字列に変換したいと思いますか?
発音区別符号の場合、分解Unicode正規化(特定のニーズに応じてNFDまたはNFKD)を実行してから、「マーク」カテゴリ(、、および)のすべての文字を削除QChar::Mark_NonSpacing
できQChar::Mark_SpacingCombining
ますQChar::Mark_Enclosing
。
他のすべて(例えば–)については、私は一般的な解決策を知りません。必要なすべての置換を含むルックアップテーブルを作成してから、検索して置換します(Laurentの回答を参照)。
部分的な解決策は、特殊文字を削除するよりも、QString::normalizedを使用することです。
QString test = QString::fromUtf8("éçàÖœ");
QString stringNormalized = test.normalized (QString::NormalizationForm_KD);
stringNormalized.remove(QRegExp("[^a-zA-Z\\s]"));
ただし、これは「œ」を「oe」に変換しないため、部分的な解決策です。
問題を部分的に解決する大まかな方法があります(アクセントだけで、「oe」などの合字はありません)。
QString title=QString::fromUtf8("éçàÖ");
qDebug("%s\n", title.toLocal8Bit().data());