2012-02-27 6 views
6

私は2つの文字列を比較するコードを記述しようとしています。 私はstrcmpを使用することができますが、他のすべてのプラットフォームと互換性があるようにマルチバイト文字列を書いてほしい memcmpを使用できますか? いいえ、他のAPIがあればそれを使うことができますか、自分でAPIを書く必要があります。memcmpの2つのマルチバイト文字列を比較できますか?

+3

2つの文字列が同じエンコードを使用しているかどうかによって異なります。 –

答えて

1

両方の文字列が同じエンコードを使用している場合、memcmpは正常に動作します。ただし、ワイド文字は異なるプラットフォームではサイズが異なることに注意してください。

文字列が異なるエンコーディングを使用する場合は、そのエンコーディングを処理するICUなどのライブラリが必要です。

2

2つの文字列で同じエンコードを使用している場合は、memcmpを使用できます。 UTF-8を使用している場合は、0がUTF-8でエンコードされた文字列で表示されないため、strcmpを使用することもできます。別のオプションは、mbstowcsを使用して文字列をワイド文字に変換することです。

+0

これは偽陰性を持つでしょう - 2つの同一の文字列を異なるバイトパターンにエンコードすることができます。 Unicodeに精通した関数と比較する必要があります。 – StilesCrisis

+0

@StilesCrisis - 同じ文字列が異なるUTF-8エンコーディングをどのように持つことができるかの例を提供できますか?それとも、ISO 8859-1のような他のsignleエンコーディングでこれがどうして起こるのでしょうか?私は、文字列が同じエンコーディングを使用する必要があったという点を確認しました。 –

+0

@Ted Hopp:UTF-8では、長い形式の文字(短いシーケンスを使用する値にデコードするシーケンス:この文はウィキペディアのものです)でエンコードすることができます。この場合、memcmpは間違った答えを返しますが、UTF-8対応の比較関数は正しい答えを返します。 – Malkocoglu

5

あなたは注意する必要があります。私はUnicode /マルチバイトエンコーディングの専門家ではありませんが、分音符号では、バイトが完全に同じでない場合、2つの文字列が等しいと見なされることがあります。文字列のエンコーディングがかなり乱雑になる可能性があるため、事前テスト済みのAPIを使用することをお勧めします。

the old new thing on case mappingを参照してください。私は分音符号のリファレンスを考えることはできませんが、私がそれを投稿します。

+0

これは正しいです。場合によっては、 'memcmp'が動作します。 100%正確さのために、そして特にどの形式のUnicodeが関わっていても、 'memcmp'は動作しません。 'é'のような単純な文字であっても、'é'(1つのUnicode文字)、 '' 'と' e'(2つのUnicode文字)のいずれかの形で表現できます。ほとんどの場合、これらは混在して一致しないので、最初は何の問題も見られないかもしれませんが、最終的にはあなたを噛んでしまいます。 – StilesCrisis

+0

文字列が「等しい」とみなされるが、バイトが等しくない別の方法は、比較が大文字と小文字を区別しない場合です。この場合、大文字小文字、小文字、大文字小文字の区別、大文字小文字の不変グリフの比較を可能にする大文字小文字の折りたたみを実行する必要があります(上で述べたように、複数のコードポイントとして表されるメモリ内にある可能性があります) )。 – Bingo

+0

正規化後の等価物は、等価物と同じではありません。それが正規化の全体点です。 OPは、2つの文字列が等しいかどうかを尋ねていました。 –

関連する問題