从字符串C ++地带非ASCII字符(C++ Strip non-ASCII Characters

2019-06-23 16:38发布

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

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”,它什么也没做我也试图替代isprintisalnum

时,在我的程序的另一部分,我转换与字符串> wstring->字符串出现真正的问题。 如果存在在与字符串的unicode字符> wstring的转换转换不太愿意。

参考:

你怎么可以从一个字符串剥离非ASCII字符? (在C#)

如何从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 ++调试库

调试断言失败!

计划://的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命令

Answer 1:

解:

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命令



Answer 2:

至少有一个问题是你的invalidChar功能。 它应该是:

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

铸造一个char到一个unsigned很可能会给一些非常,非常大的价值,如果char是负的( UNIT_MAX+1 + c). Passing such a value to UNIT_MAX+1 + c). Passing such a value to isprint`是不确定的行为。



Answer 3:

isprint取决于语言环境,所以有问题的字符必须是在当前区域设置打印。

如果你想严格ASCII,检查[0..127]的范围内。 如果你想打印的ASCII,检查范围和isprint



文章来源: C++ Strip non-ASCII Characters from string
标签: c++ string ascii