我正在尝试用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,但我真的不明白。
请帮帮我:)。
答案 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;
}