3

次のサンプル プログラムは同じ結果を出力しますが、プログラムは正しく動作しません。

NSDirectoryEnumerator *directoryEnumerator = [[NSFileManager defaultManager]
                                   enumeratorAtPath:kDocdir];

for (NSString *pathi in directoryEnumerator)
{
   NSString *fileName_Manager = [pathi lastPathComponent];
   NSLog(@"fileName_Manager = %@",fileName_Manager);

   Artist *name_Databse =  [self.fetchedResultsController
                               objectAtIndexPath:IndexPath];
   NSLog(@"name_Databse     = %@",name_Databse.name);



   if ([fileName_Manager isEqualToString:name_Databse.name]) {
       NSLog(@"Same Name");
   }else{
       NSLog(@"Different Name");
   }

}

出力:

2013-04-25 15:37:43.256 Player[36436:907] fileName_Manager = alizée - mèxico - final j'en
2013-04-25 15:37:43.272 Player[36436:907] name_Databse     = alizée - mèxico - final j'en
2013-04-25 15:37:44.107 Player[36436:907] Different Name

名前に特殊文字がある場合、正しく機能しません。なぜこうなった?ありがとう ...

ここで同じ問題があります:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name == %@",[pathi lastPathComponent]];

ここで編集するにはどうすればよいですか?

4

2 に答える 2

12

のドキュメントにisEqualToString:は、問題がある可能性があることが示唆されています。

比較では、文字列の正規表現を使用します。これは、特定の文字列の場合、文字列の長さに文字列を構成する Unicode 文字を加えたものです。このメソッドが 2 つの文字列を比較するとき、個々の Unicode が同じであれば、バッキング ストアに関係なく文字列は等しくなります。文字列比較に適用される「リテラル」は、さまざまな Unicode 分解規則が適用されず、Unicode 文字が個別に比較されることを意味します。したがって、たとえば、合成文字シーケンス「O」およびウムラウトとして表される「Ö」は、1 つの Unicode 文字として表される「Ö」と同等ではありません

使ってみて(NSOrderedSame == [string1 localizedCompare:string2])

また、まだお持ちでない場合は、多数のローカリゼーションの問題を扱っている Apple サンプル コード ' International Mountains ' を調べてください。

于 2013-04-25T13:08:09.550 に答える