始める前に; はい、私はこれが重複した質問であることを知っています、そしてはい、私は投稿された解決策を見ました。私の問題は、それらを機能させることができなかったことです。
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変換にユニコード文字がある場合、変換は失敗します。
参照:
文字列から非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
行://上
式:(符号なし)(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コマンドを使用してみてください