开始之前;是的我知道这是一个重复的问题,是的,我已经查看了发布的解决方案。我的问题是我无法让他们工作。
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命令
答案 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
。