将ASCII等效字符串替换为字符串中的所有非ASCII字符

时间:2016-05-27 13:03:13

标签: c++ string qt

使用Qt / C ++,我需要生成一个只包含ASCII字符子集的字符串:字母,数字,连字符,下划线,句点或冒号。

作为输入,我可以有任何东西。

所以我尝试应用一些规则:

  • 每个QChar :: isSpace都将替换为下划线
  • 每个非ASCII字母将替换为ASCII等效字母(例如:“é”将替换为“e”)
  • 将删除所有其他非ASCII字符

使用Qt / C ++有没有简单的方法来应用第二和第三条规则?

由于

1 个答案:

答案 0 :(得分:4)

是的,有办法。 首先,你应该对你的字符串进行unicode规范化 QString::normalized。需要标准化以将变音符号与字母分开并用ascii等价物替换一些奇特的符号。 Here您可以阅读有关规范化表单的信息。

然后你可以使用可以用Latin-1编码的字符。可以测试 QChar的toLatin1方法。

  

char QChar :: toLatin1()const

     

返回与QChar相当的Latin-1字符,或0.这对非国际化软件非常有用。

     

...

QString testString = QString::fromUtf8("Ceñía-üÏÖ马克ñ");
QString normalized = testString.normalized(QString::NormalizationForm_KD);
QString result;

copy_if(normalized.begin(), normalized.end(), back_inserter(result), [](QChar& c) {
    return c.toLatin1() != 0;
});

qDebug() << result; // Cenia-uIOn