C ++は、中国の文字列を濾過した(GBK、UTF-8)

ワープロ敏感なゲームのような最近のもので、マスキング処理を強化するために、そのようなので、上の数字、記号、文字やなど他のものに加えて、文字の文字列をフィルタリングする必要があります。

まず、情報へのアクセスと、私は機能を書きました:

例:入力文字列内の文字数を返します。

std ::文字列 StrWithOutSymbol(CONSTのstd :: 文字列ソース)
{     
    ストリングsourceWithOutSymbol。

    int型私= 0 ;
    一方、(ソース[I] =!0 
    { 
        場合(ソース[I]&0x80の
        { 
            sourceWithOutSymbol + = ソース〔I〕。
            sourceWithOutSymbol + =源[I + 1 ]。
            I + = 2 ;
        他に
        { 
            私は ++します;
        } 
    } 
    リターン
   sourceWithOutSymbol ; 
}

この機能の原理は漢字を判断するORD($ strの)&0x80であります 

80バイナリコード1000 0000に対応し、最上位ビットは、10文字のフォーマットとして知られている代表的な漢字の符号化形式は2つのバイトを占有する、ものであるが、文字を表します

「Windowsの、簡体字中国語文字セットエンコーディングが同時に高い時間は0x00で〜0x7Fまで、1バイトである場合には表現する1つのバイトと2バイトで、0x80のは2バイトで表現する場合よりも高く、 "

あなたが0x7fのより大きいのバイトコンテンツを見つけた場合、それは(パッチワークに別のバイトで)でなければならない文字、それを判断する方法を0x7Fをより確かに大きい?
から0x7f(1111111)は0x80(10000000)である番号の後ろに、私はしたいです0x7Fまで、このバイトの最上位ビットは間違いなく1よりも大きい、我々は唯一の最上位ビットがリストに1であるかどうかを判断する必要があります。

:方法分析
ビットと(同じのみ1ビットが1であり、そうでなければ0)
として:第3の数は、(100)とともに4長いビットであるかどうかを決定するために、最初の決意の数図2は、1だけ2(10)ビットである。
同様かわずか1(10000000)と8位に決定すると0x80のビットです。

なぜここ>から0x7f?PHP線はまた、強く型付けされた言語内の他に、負示すために使用されるバイトの最上位ビットは、負のは確かから0x7F(最大整数)以上ではないかもしれません


別の例:
コードはassic 97(1100001)である
コードassic 65(1000001)であります

B assicコードは98である(1100010)
assicコードB 66(1000010)であります

:文字AZ、限り、六位は間違いなく1で小文字として、私たちはケースを決定するためにこれを使用することができます:パターンが見つかり
配置する限りは0x20(100000)との手紙と同様のため、この時間をして判決を:
IF( ORD($)&0x20の){
        //大文字
}

どのように0 :?に1行目に六位にすべて大文字を入れて 
$ A = 'A';
$ A = CHR(ORD($ A)&(〜0x20の));
$ Aエコー。

 

私はそれが、この機能は、プロジェクトに追加されます確信して、ファイル名を指定して実行、タイプ中国のチェックをクリック!プロジェクトが与えられていますか?配列の境界?

これは私が文字列C ++に文字列を渡すとき、私はUTF-8エンコードに渡される使用エラーが発見されたココス-LUAを見つけ、なぜ、ですが、私はUIF-8を見に行きました符号化規則が見つかりました。

UTF-8エンコーディング規則:1バイトのみが最上位ビットが0である場合、それはその最高レベルからマルチバイト、最初のバイトである場合、連続する2進数の1ビット値の数がコードする決定10バイトの残りのバイト数が開始されます。UTF-8変換テーブルは次のよう:

 

 

 そして私は、エンコードGBKに従って操作される前に、GBK各漢字についての2バイトのみ、そして可能であれば中国UTF-8 3バイト、4バイトなので、5あるいは6、機能とクロスボーダーな状況が発生するがあるだろうと同じように、その文字列は、追加治療の必要性について、UTF-8でエンコードされたので、私は新しい機能を書いています:

中国のスクリーニング機能でUTF-8でエンコードされた文字列:

std :: 文字列 censorStrWithOutSymbol(CONSTのstd :: 文字列ソース)
{     
    ストリングsourceWithOutSymbol。

    int型私= 0 ;
    一方、(ソース[I] =!0 
    { 
        場合(ソース[I]&0x80の &&源[I]&0x40の &&源[I]&0x20の
        { 
            int型:バイト= 0 もし(ソース[I]&0x10の
            { 
                :バイト = 4
            } 
            
            { 
                :バイト = 3 
            } 
            のためのINT A = 0 ; <:バイト; ++ 
            { 
                sourceWithOutSymbol + = ソース〔I〕。
                I ++ ; 
            } 
        } 
        そう であれば(ソース[I]&0x80の &&源[I]&0x40の
        { 
            I + = 2 ; 
        } 
        
        { 
            I+ = 1 ; 
        } 
    } 
    戻りsourceWithOutSymbolと、
}

ファイル名を指定して実行、成功をクリックしてください!快適。

おすすめ

転載: www.cnblogs.com/kpxy/p/11256791.html