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

C++ 将字符串中的所有非ASCII字符替换为其等效的ASCII字符,c++,string,qt,C++,String,Qt,使用Qt/C++,我需要生成一个只包含ASCII字符子集的字符串:字母、数字、连字符、下划线、句点或冒号 作为输入,我可以拥有任何东西 因此,我尝试应用一些规则: 每个QChar::isSpace都将替换为下划线 每一个非ASCII字母都将替换为ASCII等效字母(例如:“e”将替换为“e”) 每隔一个非ASCII字符将被删除 使用Qt/C++有没有简单的方法来应用第二条和第三条规则 谢谢是的,有办法。 首先,您应该使用 QString::规范化。需要进行规范化,以将变音符号与字母分开,并用

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

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

因此,我尝试应用一些规则:

  • 每个QChar::isSpace都将替换为下划线
  • 每一个非ASCII字母都将替换为ASCII等效字母(例如:“e”将替换为“e”)
  • 每隔一个非ASCII字符将被删除
使用Qt/C++有没有简单的方法来应用第二条和第三条规则

谢谢

是的,有办法。 首先,您应该使用
QString::规范化
。需要进行规范化,以将变音符号与字母分开,并用ascii等价物替换一些花哨的符号。您可以阅读有关规范化表单的内容

然后你可以用拉丁语1编码的字符。可以用 QChar方法

char QChar::toLatin1()常量

返回相当于QChar的拉丁字符1,或0。这主要适用于非国际化软件

QString testString=QString::fromUtf8(“Ceñía-üÏÖ”马克ñ");
QString normalized=testString.normalized(QString::NormalizationForm_KD);
QString结果;
复制if(normalized.begin()、normalized.end()、back_插入器(结果),[](QChar&c){
返回c.toLatin1()!=0;
});
是的,有一种方法。
首先,您应该使用
QString::规范化
。需要进行规范化,以将变音符号与字母分开,并用ascii等价物替换一些花哨的符号。您可以阅读有关规范化表单的内容

然后你可以用拉丁语1编码的字符。可以用 QChar方法

char QChar::toLatin1()常量

返回相当于QChar的拉丁字符1,或0。这主要适用于非国际化软件

QString testString=QString::fromUtf8(“Ceñía-üÏÖ”马克ñ");
QString normalized=testString.normalized(QString::NormalizationForm_KD);
QString结果;
复制if(normalized.begin()、normalized.end()、back_插入器(结果),[](QChar&c){
返回c.toLatin1()!=0;
});

qDebug()如果您可以输入任何内容,那么
字符?这是可能的,但实际上您需要维护一个数据库,将Unicode字符映射到您认为的ANSI等效字符。Windows有一个操作系统API来实现这一点,
WideCharToMultiByte
。我不确定Qt中是否内置了任何东西;很容易通过查阅文档来判断。通常策略是用通用字符替换“未知”字符,如矩形框或简单问号,而不是像规则3建议的那样删除它们。但是你可以做任何你想做的事;通常API带有一个标志。@vahancho:根据我计划使用的“简单”规则,只需将其删除即可。如果你有更好的选择,我愿意@科迪·格雷:我尽量避免维护这样一个数据库。我的应用程序是多格式的,所以没有Windows API调用。如果我没有找到更好的解决方案,我将使用替换数据库。哪个ANSI字符集?您是指ASCII码吗?如果您可以输入任何东西,那么
字符?这是可能的,但实际上您需要维护一个数据库,将Unicode字符映射到您认为的ANSI等效字符。Windows有一个操作系统API来实现这一点,
WideCharToMultiByte
。我不确定Qt中是否内置了任何东西;很容易通过查阅文档来判断。通常策略是用通用字符替换“未知”字符,如矩形框或简单问号,而不是像规则3建议的那样删除它们。但是你可以做任何你想做的事;通常API带有一个标志。@vahancho:根据我计划使用的“简单”规则,只需将其删除即可。如果你有更好的选择,我愿意@科迪·格雷:我尽量避免维护这样一个数据库。我的应用程序是多格式的,所以没有Windows API调用。如果我没有找到更好的解决方案,我将使用替换数据库。哪个ANSI字符集?你是指ASCII码吗?
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