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

Aur*_*ien 2 c++ string qt

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

\n\n

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

\n\n

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

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

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

\n\n

谢谢

\n

Vya*_*mov 6

是的,有一种方法。 \n首先你应该使用 \n 对字符串进行 unicode 标准化QString::normalized。需要标准化来将变音符号与字母分开,并用 ASCII 等效符号替换一些奇特的符号。在这里您可以阅读有关规范化表格的信息。

\n

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

\n
\n

char QChar::toLatin1() const

\n

返回与 QChar 等效的 Latin-1 字符或 0。这主要对非国际化软件有用。

\n

...

\n
\n
QString testString = QString::fromUtf8("Ce\xc3\xb1\xc3\xada-\xc3\xbc\xc3\x8f\xc3\x96\xe9\xa9\xac\xe5\x85\x8b\xc3\xb1");\nQString normalized = testString.normalized(QString::NormalizationForm_KD);\nQString result;\n\ncopy_if(normalized.begin(), normalized.end(), back_inserter(result), [](QChar& c) {\n    return c.toLatin1() != 0;\n});\n\nqDebug() << result; // Cenia-uIOn\n
Run Code Online (Sandbox Code Playgroud)\n