You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在C++/Qt中实现忽略变音符号的子串查找

忽略变音符号的Qt子串匹配解决方案

要实现忽略变音符号、大小写的子串匹配,你可以通过字符串规范化+特殊字符映射+普通子串查找的组合方式解决,比直接用QCollator更可靠,也能覆盖你遇到的特殊字符问题。

核心思路

  1. 将字符串规范化为NFD格式,把带变音的字符分解为"基础字符+变音标记";
  2. 过滤掉所有变音标记;
  3. 将特殊形态的字符(如Ð、Ø)映射到对应的普通ASCII字符;
  4. 统一转为小写(或大写)后,用普通的子串查找方法即可。

实现代码

字符串规范化与映射函数

QString normalizeString(const QString& source) {
    // 第一步:规范化为NFD,拆分变音符号与基础字符
    QString normalized = source.normalized(QString::NormalizationForm_D);
    QString result;

    for (const QChar& c : normalized) {
        // 过滤非间距标记和组合间距标记(即所有变音符号)
        if (c.category() != QChar::Mark_NonSpacing && c.category() != QChar::Mark_SpacingCombining) {
            QChar mapped = c;
            // 映射特殊字符到普通ASCII字符,可根据需求扩展
            switch (c.unicode()) {
                case 0x00D0: mapped = 'D'; break;    // 拉丁大写字母ETH(Ð)
                case 0x00F0: mapped = 'd'; break;    // 拉丁小写字母eth(ð)
                case 0x00D8: mapped = 'O'; break;    // 拉丁大写字母O带斜线(Ø)
                case 0x00F8: mapped = 'o'; break;    // 拉丁小写字母o带斜线(ø)
                case 0x00DF: result.append("ss"); continue; // 德语ß,需映射为两个字符
                case 0x00E6: result.append("ae"); continue; // 拉丁小写字母æ
                case 0x00C6: result.append("AE"); continue; // 拉丁大写字母Æ
                default: break;
            }
            result.append(mapped);
        }
    }

    // 统一转为小写,消除大小写差异
    return result.toLower();
}

子串匹配函数

bool containsIgnoringDiacritics(const QString& fullString, const QString& searchString) {
    QString processedFull = normalizeString(fullString);
    QString processedSearch = normalizeString(searchString);
    return processedFull.contains(processedSearch);
}

测试验证

  • 对于原字符串"This is éval",处理后变为"this is eval",搜索"eval"或"Eval"都会返回true;
  • 对于你的测试字符串"üó ÐÈMØ",处理后变为"uo demo",搜索"demo"即可匹配成功。

为什么之前的QCollator方法无效?

QCollator的compare方法是基于排序规则的相等性判断,并非针对字符的直接匹配,而且你逐个截取子串的方式不仅效率低,也无法利用collator的规则正确处理子串场景——collator的设计目标是全字符串的排序对比,不是子串匹配。

扩展建议

如果需要覆盖更多特殊字符,可以参考Unicode字符表,在switch中添加对应的映射规则,比如添加À→A、ñ→n等常见变音字符的映射,或者针对特定语言的字符做补充。

内容的提问来源于stack exchange,提问作者Laurens Brock

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 00:13:14