Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 如何从Qt中的字符串中删除重音符号/变音符号?_String_Qt_Diacritics_Qstring - Fatal编程技术网

String 如何从Qt中的字符串中删除重音符号/变音符号?

String 如何从Qt中的字符串中删除重音符号/变音符号?,string,qt,diacritics,qstring,String,Qt,Diacritics,Qstring,如何删除Qt中字符串的变音符号。例如,这: QString test = QString::fromUtf8("éçàÖœ"); qDebug() << StringUtil::removeAccents(test); Qt中没有严格的内置解决方案。一个简单的解决方案(在大多数情况下都适用)是循环遍历字符串,并将每个字符替换为等效字符: QString StringUtil::diacriticLetters_; QStringList StringUtil::noDiacriti

如何删除Qt中字符串的变音符号。例如,这:

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

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;
}
QString StringUtil::diacriticLetters;
QStringList StringUtil::noDiacriticLetters;
QString StringUtil::removeAccents(QString s){
if(diacriticLetters.isEmpty()){
发音符号:来自UTF8;

noDiacriticLetters\up>有一种简陋的方法可以部分解决你的问题(只是重音,而不是像“oe”这样的连字)


你的问题有点误导人。你似乎想做的不仅仅是删除变音符号(œ是一个没有变音符号的连字字母)。我猜你想把任何Unicode字符串转换成大致对应的ASCII字符串

对于变音符号,您可以执行分解Unicode规范化(NFD或NFKD,取决于您的具体需要),然后删除“标记”类别的所有字符(
QChar::Mark_Nonspacking
QChar::Mark_SpacingCombing
QChar::Mark_Enclosuring


对于其他所有问题(例如,œ),我不知道通用解决方案。创建一个包含所有所需替换项的查找表,然后进行搜索和替换(参见Laurent的答案)。

部分解决方案是使用QString::normalized,而不是删除特殊字符

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

但是,这是一个局部解决方案,因为它不会将“œ”转换为“oe”.

除非您之前进行了Unicode标准化,并且只想替换可以标准化为单个复合字符的图形,否则,
diacriticLetters\u
也需要是QStringList。我必须用diacriticLetters\uqstring替换第6行(根据未定义的行为,助理依赖于这种行为!
QString title=QString::fromUtf8("éçàÖ");
qDebug("%s\n", title.toLocal8Bit().data());
QString test = QString::fromUtf8("éçàÖœ");
QString stringNormalized = test.normalized (QString::NormalizationForm_KD);
stringNormalized.remove(QRegExp("[^a-zA-Z\\s]"));