6
6

More than 5 years have passed since last update.

NSStringのisEqualToString:の落とし穴

Last updated at Posted at 2013-05-01

※この記事は間違った情報を記述しています

NSStringにはisEqualToString:[isEqual:]で文字を比較することができます。
しかしながら、この比較というのはliteral Unicode-based comparison、バイト列の比較なのです。
つまり、文字列的には同じだが、バイト列としては違う場合、
isEqualToStringは違うものと判断してしまいます。
従ってこの挙動が望ましくない場合、compare:等のその他の比較メソッドの中から適切に選択する必要があります。

caseInsensitiveCompare:やlocalizedCompare:等々色々ありますね。
この辺はまたしっかりリサーチができたらいずれまとめたいです。

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[])
{
    @autoreleasepool {
        char a[] = "あいうえお";
        char b[] = "あいうえお";
        NSString *aString = [NSString stringWithCString:a encoding:NSUTF8StringEncoding];
        NSString *bString = [NSString stringWithCString:b encoding:NSUTF16StringEncoding];

        printf("[aString isEqual:bString] => %s\n", [aString isEqual:bString]? "YES" : "NO");
        printf("[aString isEqualToString:bString] => %s\n", [aString isEqualToString:bString]? "YES" : "NO");
        printf("[aString compare:bString] => %s\n", [aString compare:bString]? "YES" : "NO");
    }
    return 0;
}

出力
[aString isEqual:bString] => NO
[aString isEqualToString:bString] => NO
[aString compare:bString] => YES

追記 5/8

なんだか文字列比較がよくわからなくなってきました。

int main(int argc, const char * argv[])
{
    @autoreleasepool {
        char a[] = "あいう";
        unichar b[] = {L'あ', L'い', L'う'};

        NSString *aString = [NSString stringWithCString:a encoding:NSUTF8StringEncoding];
        NSString *bString = [NSString stringWithCharacters:b length:sizeof(b) / sizeof(b[0])];

        printf("[aString isEqual:bString] => %s\n", [aString isEqual:bString]? "YES" : "NO");
        printf("[aString isEqualToString:bString] => %s\n", [aString isEqualToString:bString]? "YES" : "NO");
        printf("[aString compare:bString] => %s\n", [aString compare:bString] == NSOrderedSame? "YES" : "NO");
        printf("[aString compare:bString options:NSLiteralSearch] => %s\n", [aString compare:bString options:NSLiteralSearch] == NSOrderedSame? "YES" : "NO");
    }
    return 0;
}

出力
[aString isEqual:bString] => YES
[aString isEqualToString:bString] => YES
[aString compare:bString] => YES
[aString compare:bString options:NSLiteralSearch] => YES

6
6
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
6