2011-08-02 126 views
1

如何从字符串中去除非ASCII字符?如何从字符串中去除非ASCII字符?在C++中

我想知道我们如何能在C++中实现这一

+1

顺便说一句,在真实世界中的应用,通过剥离Unicode字符“解决”在你的代码中的错误是一个坏主意。 –

+0

@Delan Azabani这只发生在文件的末尾。我无法在文件末尾看到该字符(手动)。 – Thangaraj

+0

你可能有一个错误。你确定你的字符串是空的终止? – cprogrammer

回答

3

也许是这样的:

struct InvalidChar 
{ 
    bool operator()(char c) const { 
     return !isprint(static_cast<unsigned char>(c)); 
    } 
}; 

std::string s; 
HypoteticalReadFileToString(&s); 
s.erase(std::remove_if(s.begin(),s.end(),InvalidChar()), s.end()); 

其更好,以限定可重复使用的功能为擦除remove惯用法

template <typename C, typename P> 
void erase_remove_if(C& c, P predicate) { 
    c.erase(std::remove_if(c.begin(), c.end(), predicate), c.end()); 
} 

...

erase_remove_if(s, InvalidChar()); 
+1

你的逻辑倒退了吗?应该是'return!isprint((unsigned c))'? – crashmstr

+2

严格来说,这将除去非ASCII字符。 –

+0

是的逻辑倒退了!我会编辑它。 – Pete

-1

地带的一切,大于127,或见http://www.asciitable.com/,并创建一个更具体的范围

while (CrtChar) 
{ 
    if (*CrtChar<35 || *CrtChar>127) 
    *CrtChar = ' '; 
} 
+0

我也这么做了:( – Thangaraj

+0

这可能赢了' t工作:如果unicode字符是两个字节会怎么样? – duedl0r

+0

[isprint](http://www.cplusplus.com/reference/clibrary/cctype/isprint/)怎么样计算可比?如果你只是在检查数值,你可能也想剥离低端! – crashmstr

0
void stringPurifier (std::string& s) 
{ 
    for (std::string::iterator it = s.begin(), itEnd = s.end(); it!=itEnd; ++it) 
    { 
     if (static_cast<unsigned int>(*it) < 32 || static_cast<unsigned int>(*it) > 127) 
     { 
     (*it) = ' '; 
     } 
    } 
} 

void stringPurifier (std::string& dest, const std::string& source) 
{ 
    dest.reserve(source.size()); 
    for (std::string::const_iterator it = source.begin(), itEnd = source.end(); it!=itEnd; ++it) 
    { 
    if (static_cast<unsigned int>(*it) < 32 || static_cast<unsigned int>(*it) > 127) 
    { 
     dest.push_back(' '); 
    } 
    else 
    { 
     dest.push_back(*it); 
    } 
    } 
} 
相关问题