C ++从字符串中删除非ASCII字符

时间:2012-04-16 17:22:45

标签: c++ string ascii

开始之前;是的我知道这是一个重复的问题,是的,我已经查看了发布的解决方案。我的问题是我无法让他们工作。

bool invalidChar (char c)
{ 
    return !isprint((unsigned)c); 
}
void stripUnicode(string & str)
{
    str.erase(remove_if(str.begin(),str.end(), invalidChar), str.end()); 
}

我在“Prusæus,Ægyptians”上测试了这种方法,但它没有做任何事情 我还尝试将isprint替换为isalnum

真正的问题出现在我的程序的另一部分我转换string-> wstring-> string。如果string-> wstring转换中有unicode字符,则转换为balks。

价:

How can you strip non-ASCII characters from a string? (in C#)

How to strip all non alphanumeric characters from a string in c++?

修改

我仍然希望删除所有非ASCII字符,无论它是否有帮助,这里是我崩溃的地方:

// Convert to wstring
wchar_t* UnicodeTextBuffer = new wchar_t[ANSIWord.length()+1];
wmemset(UnicodeTextBuffer, 0, ANSIWord.length()+1);
mbstowcs(UnicodeTextBuffer, ANSIWord.c_str(), ANSIWord.length());
wWord = UnicodeTextBuffer; //CRASH

错误对话

MSVC ++调试库

Debug Assertion失败!

Program:// myproject

文件:f:\ dd \ vctools \ crt_bld \ self_x86 \ crt \ src \ isctype.c

行://上方

表达式:(无符号)(C + 1) - = 256

修改

进一步加剧了这个问题:我正在读取的.txt文件是ANSI编码的。 中的所有内容都有效。

解决方案:

bool invalidChar (char c) 
{  
    return !(c>=0 && c <128);   
} 
void stripUnicode(string & str) 
{ 
    str.erase(remove_if(str.begin(),str.end(), invalidChar), str.end());  
}

如果其他人想要复制/粘贴此内容,我可以关闭此问题。

修改

供将来参考:尝试使用__isascii, iswascii命令

3 个答案:

答案 0 :(得分:12)

解决方案:

bool invalidChar (char c) 
{  
    return !(c>=0 && c <128);   
} 
void stripUnicode(string & str) 
{ 
    str.erase(remove_if(str.begin(),str.end(), invalidChar), str.end());  
}

编辑:

供将来参考:尝试使用__isascii,iswascii命令

答案 1 :(得分:2)

invalidChar功能至少存在一个问题。它应该是:

return !isprint( static_cast<unsigned char>( c ) );

char投射到unsigned可能会给一些非常非常大的内容 如果char为负数(UNIT_MAX+1 + c). Passing such a value to isprint`为未定义的行为,则为值。

答案 2 :(得分:0)

isprint取决于区域设置,因此相关字符必须在当前区域设置中可打印。

如果您想要严格的ASCII,请检查[0..127]的范围。如果您想要可打印的ASCII,请检查范围和isprint