2017-03-02 7 views
3

文字配列には、Unicode文字が含まれている場合と含まれていない場合があります。存在する場合、Unicode文字とASCII文字が混在します。 char文字列を走査しながらUnicode文字をフィルタリングする方法を見つける必要があります。文字配列内のUnicode文字をフィルタリングします。

そして、私はC++ですべてを行う必要があります。

+3

質問は少し曖昧です。ユニコードは異なる方法でエンコードすることができます。あなたは_normal_文字で正確に何を意味しますか? _ASCII_? [UTF-8](https://en.wikipedia.org/wiki/UTF-8)のような一部のエンコーディングでは、_ASCII_がサブセットとして含まれているため、これらをフィルタリングすることはできません。 – Codor

+0

あなたは特定の答えることができる質問を尋ねることを忘れて、あなたがそれを解決しようとしたことにどのように抵抗したのかを記述してください。 –

答えて

2

これは一般的に不可能です。文字は単なる数字です。エンコーディングに関する情報は持ちません。

類推を考慮してください:数値はユニットに関する情報を運びません。宇宙船が0.5の速度で移動する場合、1キロメートルを移動するにはどのくらいの時間がかかりますか?ユニットによって異なります。毎秒0.5メートルですか?それとも光速の0.5倍ですか?あなたはその番号からはわかりません。

同様に、値76はどのような文字を表しますか?あなたがエンコーディングを知らない限り、あなたは知ることができません。エンコーディングがUTF-8の場合、'L'を表します。エンコードがEBCDICの場合は、'<'を表します。だから、フィルタリングするはずの76 Unocide 'L'ですか、それともフィルターに掛からないEBCDIC '<'ですか?

値がどのエンコーディングであるかはわかりませんが、値が特定のエンコーディングに含まれていないと判断できる場合があります。たとえば、ASCIIは7ビットのエンコーディングであるため、127より大きい任意の(符号なしの)番号はASCIIにできません。

したがって、ASCIIとUnicodeが混在している場合は、127より大きい値がUnicodeであり、他の値がUnicodeまたはASCIIのいずれかであると判断できます。実際にUnicodeの最初の127コードポイントには、設計上のASCIIと同じマッピングがあるため、他の値はUnicode ASCIIの両方です。

1

質問に答えるには、文字配列で使用されている特定のUnicode エンコードを知っておくことが重要です。あなたの質問でcharを参照したので、あなたの"文字"配列がcharの配列であると仮定しているので、UTF-8をUnicodeエンコーディングとして使用している可能性が非常に高いです。

nice properties of UTF-8の1つは、ASCIIが適切なサブセットであることです。したがって、配列char全体を単純にスキャンすることができます。現在のcharの上位ビットがクリアされている場合(つまり、0または同等のバイト値が<= 127の場合)、これは純粋な(7ビットの)ASCII文字であり、それを受け入れます。それ以外の場合、charはマルチバイトUTF-8シーケンスの一部です。スキップして配列内の次のcharに移動して繰り返します。

1

コードはwdieバイト形式であるか、またはUTF-8です。いずれの場合も論理は同じです。

ASCIIコードの範囲は0-127です。

int j = 0; 
int i; 

for(i=0;i<Len;i++) 
    if(unicode[i] >= 0 && unicode[i] <=127) 
    unicode[j++] = unicode[i]; 

形式はUTF-8である場合、それは単に同じコードだが、あなたは、各拡張文字の高ビットが設定された複数の文字をスキップします。 8ビットのchar * asciiが必要な場合は、データをUnicodeバッファに保存するのではなく、ASCIIバッファに割り当てる必要があります。

+0

ステートメントが次のようなものかどうか疑問に思う: 'unicode_filtered [j ++] = unicode [i];'は、フィルタリングされた値を新しい配列に格納することを意味する。 – user3405291

関連する問題