清除字符串中的非字母字符a 我试图在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;

清除字符串中的非字母字符a 我试图在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;,c++,string,unicode,special-characters,C++,String,Unicode,Special Characters,所以我的问题是,如何删除“!!!!!?| | | ~”而不是“ÆØ” 我也尝试过类似的测试 test.at(l)!='Å' 但是如果我将“Å”声明为char,我就无法编译 我读过unicode和utf8,但我不太懂 请帮助我:)char用于ASCII字符集,您正在尝试对具有非ASCII字符的字符串进行操作 您正在对Unicode字符进行操作,因此需要使用宽字符串操作: int main() { wstring test = L"Danish letters: Æ Ø Å !!!!!!?

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

我也尝试过类似的测试

test.at(l)!='Å'
但是如果我将“Å”声明为char,我就无法编译

我读过unicode和utf8,但我不太懂


请帮助我:)

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;
}

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;
}

下面是一个代码示例,您可以使用不同的语言环境进行游戏和实验,以便获得所需的内容。您可以使用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;
}
#包括
#包括
#包括
#包括
#包括
wstring测试=L“丹麦字母:ÆØØØØØØØØØØØØØØØØØὁ Σάμιος";
removeNonAlpha(试验);
wstring removeNonAlpha(常量wstring&输入){
类型定义编码VT Cvt;
locale utf8locale(locale(),新编解码器vt_byname(“en_US.UTF-8”);
wcout.imbue(utf8locale);

wcout这里是一个代码示例,您可以使用不同的语言环境进行游戏和实验,以便获得所需的内容。您可以使用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;
}
#包括
#包括
#包括
#包括
#包括
wstring测试=L“丹麦字母:ÆØØØØØØØØØØØØØØØØØὁ Σάμιος";
removeNonAlpha(试验);
wstring removeNonAlpha(常量wstring&输入){
类型定义编码VT Cvt;
locale utf8locale(locale(),新编解码器vt_byname(“en_US.UTF-8”);
wcout.imbue(utf8locale);


wcout好吧,你需要一直阅读unicode和utf8,直到你真正理解它,然后一切都应该非常清楚。你可能想看看这个题为的问题。我也有兴趣看看在你的案例中是否有用。@RawN:这两个链接都只用于ASCII,而这个问题是(隐式的)关于非ASCII .@在C++中没有任何东西(或C)仅适用于ASCII。@TomBlodget:从技术上讲,你是对的。从技术上讲,它们只适用于传统的字符编码子集。它们不适用于UNicode字符,这段代码可能正在使用UNicode字符。嗯,你需要一直阅读UNicode和utf8,直到你理解它,然后一切都应该非常清楚。你可能Ant去看这个标题题。我也感兴趣的是看看你的情况是否有用。@ RawN:这两个链接都是针对ASCII的,这个问题是(隐含的)关于非ASCII。@在C++中没有任何东西(或C)。仅适用于ASCII。@TomBlodget:从技术上讲,你是对的。从技术上讲,它们只适用于传统的字符编码子集。它们不适用于UNicode字符,这段代码可能正在使用UNicode字符。是的,这段代码只保留英语和非英语字符,因为我们使用的是iswalpha。哇,我的表情符号示例非常糟糕开头:C++宽函数和类只在基本多语言平面上工作,当在补充平面中给定字符时失败,当前包含73000个字符,其中一些字符必然是字母字符。 ISWALPHA 被打破。定义的固定宽度编码可能与Unicode无关。它可以基于Windows上的UTF-16,其效果是无法正确处理BMP以外的字符,也可以使用Linux上的UTF-32,这使得完全支持Unicode成为可能。或者它可以使用完全不同的字符集。@nwellnhof:我忘记了如何实现ATION定义的宽字符是。你是对的,对于4字节宽,那么是的,它们可以干净地处理所有的Unicode。但是对于2字节宽,没有可能实现处理所有的Unicode。是的,这段代码只留下英语和非英语字符,因为我们使用的是iswalpha。哇,我的表情符号示例考虑得非常糟糕。StarTION:C++的函数和类只在基本多语言平面上工作,当在补充平面中给定字符时失败,其中当前包含73000个字符,其中一些字符必然是字母字符。<代码> ISWalPHA 被破坏。-宽度编码可能与Unicode无关。它可以基于UTF-16,就像在Windows上一样,其效果是BMP以外的字符不能正确处理;或者它可以使用UTF-32,就像在Linux上一样,这使得完全支持Unicode成为可能。或者它可以使用完全不同的字符集。@nwellnhof:我忘记了实现是如何定义的d宽字符是。你是对的,对于4字节宽,那么是的,它们可以干净地处理所有Unicode。但是对于2字节宽,没有可能实现处理所有Unicode。
wchar\u t
不能保证足够宽来表示Unicode代码点。在Windows上,它是16位的,表示UTF-16代码单元,而不是代码点。
wchar\u t
不能保证足够宽以表示Unicode代码点。在Windows上,它是16位的,表示UTF-16代码单元,而不是代码点。