※この記事は間違った情報を記述しています##
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