C++ C++;从字符串中去除非ASCII字符
在你开始之前;是的,我知道这是一个重复的问题,是的,我已经看过了发布的解决方案。我的问题是我不能让他们工作C++ C++;从字符串中去除非ASCII字符,c++,string,ascii,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()); } 我在“普鲁斯库斯,吉普提亚人”
bool invalidChar (char c)
{
return !isprint((unsigned)c);
}
void stripUnicode(string & str)
{
str.erase(remove_if(str.begin(),str.end(), invalidChar), str.end());
}
我在“普鲁斯库斯,吉普提亚人”身上测试了这种方法,但没有任何效果
我还试图用isprint
替换isalnum
当我在程序的另一个部分转换string->WSString->string时,真正的问题就会出现。如果字符串->wstring转换中存在unicode字符,转换将停止
参考:
编辑:
bool invalidChar (char c)
{
return !(c>=0 && c <128);
}
void stripUnicode(string & str)
{
str.erase(remove_if(str.begin(),str.end(), invalidChar), str.end());
}
我仍然想删除所有非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++调试库
调试断言失败
Program://myproject
文件:f:\dd\vctools\crt\u bld\self\u x86\crt\src\isctype.c
第:/行
表达式:(unsigned)(c+1)=0&&c您的
invalidChar
函数中至少存在一个问题。应该是:
return !isprint( static_cast<unsigned char>( c ) );
返回!isprint(静态_cast(c));
将char
转换为unsigned
可能会产生非常非常大的错误
如果char
为负值(UNIT_MAX+1+c),则为。通过这样一个
isprint`的值是未定义的行为。isprint
取决于区域设置,因此相关字符必须在当前区域设置中可打印
如果需要严格的ASCII码,请检查[0..127]的范围。如果需要可打印的ASCII码,请检查范围和isprint
解决方案:
bool invalidChar (char c)
{
return !(c>=0 && c <128);
}
void stripUnicode(string & str)
{
str.erase(remove_if(str.begin(),str.end(), invalidChar), str.end());
}
bool invalidChar(字符c)
{
return!(c>=0&&c如果将invalidChar更改为始终返回true,会发生什么情况?如果总是返回false,会发生什么情况。另外,还要记录ivalidChar获取的内容及其输出。@Dani…(更多字符要发布)确保调用setlocale(“”)
在进行转换之前。如果转换不能处理非ASCII字符,那么转换就没有意义了,是吗!@Dani将invalidChar设置为返回true
将踢出一个空白字符串,而false
则不起任何作用。我也怀疑这是问题所在,但我不确定使用isprint
以外的方法disalnum
因为他们似乎没有完成任务。@KerrekSB我有这样一个:setlocale(LC_ALL,”)
比抛出错误的那一行再向下几行。我用它来转换wstring->string。你是说我应该把它向上移动几行吗?按规定切换方法会修复Prusæus
但不会修复仍然会导致崩溃的gyptians
。@AnthonyW如果c
有typechar
,你会在英特尔平台上,然后在调用isprint
之前将其强制转换为unsigned char
,应该可以使这部分代码正常工作。当然,ASCII的含义仍然存在问题;我使用的定义是c>=0和&c<128
(但这包括像EOT或DEL这样的不可打印ASCII)。是的,这就是我正在寻找的字符集。除非我弄错了,Æ
不是成员,但它拒绝删除。当然,我可能弄错了,在这种情况下,我需要另一种方法。将语句切换到返回!(c>=0&&c)即使检查