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

Replace all non-ASCII characters in a string by their ASCII equivalent

本文关键字:ASCII 替换 字符 字符串      更新时间:2023-10-16

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

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

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

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

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

谢谢

是的,有办法。首先,您应该对字符串进行 unicode 规范化 QString::normalized .需要规范化以将变音符号与字母分开,并将一些花哨的符号替换为 ascii 等效符号。在这里,您可以阅读有关规范化表单的信息。

然后,您可以获取可以用拉丁语-1编码的字符。可以测试到拉丁语1方法的QChar。

char QChar::toLatin1() const

返回与 QChar 等效的拉丁语 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