清除非字母字符的字符串

时间:2016-10-01 20:34:24

标签: c++ string unicode special-characters

我正在尝试用C ++清理字符串。我想为所有非字母字符清理它,并保持各种英语和非英语字母不变。我的一个测试代码看起来像这样

int main()
{
string test = "Danish letters: Æ Ø Å !!!!!!??||~";
cout << "Test = " << test << endl;

for(int l = 0;l<test.size();l++)
{
    if(!isalpha(test.at(l)) && test.at(l) != ' ')
    {
        test.replace(l,1," nope");  
    }
}

cout << "Test = " << test << endl;

return 0;

}

这给了我输出:

Test = Danish letters: Æ Ø Å !!!!!!??||~
Test = Danish letters nope  nope nope  nope nope  nope nope  nope nope nope nope nope nope nope nope nope nope nope"

所以我的问题是,如何删除“!!!!!! ?? ||〜”而不是“ÆØÅ”?

我也尝试了像

这样的测试
test.at(l)!='Å'

但是我无法编译,如果我将'Å'声明为char。

我读过unicode和utf8,但我真的不明白。

请帮帮我:)。

2 个答案:

答案 0 :(得分:1)

char用于ASCII字符集,并且您尝试对具有非ASCII字符的字符串进行操作。

您正在对Unicode字符进行操作,因此您需要使用宽字符串操作:

int main()
{
    wstring test = L"Danish letters: Æ Ø Å !!!!!!??||~";
    wcout << L"Test = " << test << endl;

    for(int i = 0; i < test.size(); i++) {

        if(!iswalpha(test.at(i)) && test.at(i) != ' ') {

            test.replace(i,1,L" nope");
        }
    }

    wcout << L"Test = " << test << endl;

    return 0;
}

您也可以使用Qt并使用QString,因此代码的相同安静将成为:

QString test = "Danish letters: Æ Ø Å !!!!!!??||~";
qDebug() << "Test =" << test;

for(int i = 0; i < test.size(); i++) {

    if(!test.at(i).isLetterOrNumber() && test.at(i) != ' ') {

        test.replace(i, 1, " nope");
    }
}

qDebug() << "Test = " << test;

答案 1 :(得分:1)

这是一个代码示例,您可以使用不同的区域设置和实验来获得您想要的内容。您可以尝试使用u16string,u32string等。使用区域设置在开始时有点混乱。大多数人用ASCII编程。

主函数中的

调用我写的那个

#include <iostream>
#include <string>
#include <codecvt>
#include <sstream>
#include <locale>

wstring test = L"Danish letters: Æ Ø Å !!!!!!??||~ Πυθαγόρας ὁ Σάμιος";
removeNonAlpha(test);


wstring removeNonAlpha(const wstring &input) {
   typedef codecvt<wchar_t, char, mbstate_t> Cvt;
   locale utf8locale(locale(), new codecvt_byname<wchar_t, char, mbstate_t> ("en_US.UTF-8"));
   wcout.imbue(utf8locale);
   wcout << input << endl;
   wstring res;
   std::locale loc2("en_US.UTF8");
   for(wstring::size_type l = 0; l<input.size(); l++) {
      if(isalpha(input[l], loc2) || isspace(input[l], loc2)) {
         cout << "is char\n";
         res += input[l];
      }
      else {
         cout << "is not char\n";
      }
   }
   wcout << L"Hello, wide to multybyte world!" << endl;
   wcout << res << endl;
   cout << std::isalpha(L'Я', loc2) << endl;
   return res;
}