Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;从字符串中去除非ASCII字符_C++_String_Ascii - Fatal编程技术网

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
以外的方法d
isalnum
因为他们似乎没有完成任务。@KerrekSB我有这样一个:
setlocale(LC_ALL,”)
比抛出错误的那一行再向下几行。我用它来转换wstring->string。你是说我应该把它向上移动几行吗?按规定切换方法会修复
Prusæus
但不会修复仍然会导致崩溃的
gyptians
。@AnthonyW如果
c
有type
char
,你会在英特尔平台上,然后在调用
isprint
之前将其强制转换为
unsigned char
,应该可以使这部分代码正常工作。当然,ASCII的含义仍然存在问题;我使用的定义是
c>=0和&c<128
(但这包括像EOT或DEL这样的不可打印ASCII)。是的,这就是我正在寻找的字符集。除非我弄错了,
Æ
不是成员,但它拒绝删除。当然,我可能弄错了,在这种情况下,我需要另一种方法。将语句切换到
返回!(c>=0&&c)即使检查