8

始める前に; はい、私はこれが重複した質問であることを知っています、そしてはい、私は投稿された解決策を見ました。私の問題は、それらを機能させることができなかったことです。

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コマンドを使用してみてください

4

3 に答える 3

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コマンドを使用してみてください

于 2013-04-04T14:04:55.883 に答える
2

少なくとも1つの問題がinvalidChar関数にあります。そのはず:

return !isprint( static_cast<unsigned char>( c ) );

charaをanにキャストすると、が負の場合(isprint`は未定義の動作) unsigned、非常に大きな値が得られる可能性があります。charUNIT_MAX+1 + c). Passing such a value to

于 2012-04-16T17:28:38.860 に答える
0

isprintロケールによって異なるため、問題の文字は現在のロケールで印刷可能である必要があります。

厳密にASCIIが必要な場合は、[0..127]の範囲を確認してください。印刷可能なASCIIが必要な場合は、範囲とを確認してくださいisprint

于 2012-04-16T18:31:55.837 に答える