在开始之前,是的,我知道这是一个重复的问题,是的,我已经查看了发布的解决方案。我的问题是我无法让它们起作用。
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
。当我将字符串转换为宽字符串再转换回字符串时,在程序的另一个部分出现了真正的问题。如果在字符串->宽字符串转换中有unicode字符,则会出现转换错误。
参考: 如何从字符串中删除非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
行://上面
表达式:(unsigned)(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命令。
setlocale("");
。如果无法处理非 ASCII 字符,那么进行转换就没有意义了! - Kerrek SBISO-8859-15
,UTF-8
)。 - Kerrek SBsetlocale(LC_ALL, "UTF-8");
都没有任何效果。 - AnthonyW""
,则可以在 shell 中设置区域设置:LC_ALL=en_GB.utf8 ./myprog
。 - Kerrek SB