iOS正确比较文件路径

时间:2014-02-04 08:50:21

标签: ios objective-c nsstring nsurl

我在我正在编写的应用程序中遇到一个问题,我需要比较一个指向文件的NSURL和一个NSString,它是同一文件路径的传入字符串表示。

我无法让它们进行比较 - 当NSLogging令人困惑时我给出的输出,也许这是一个编码问题?

我可以使用此代码使它们看起来相同:[urlString stringByRemovingPercentEncoding];

NSURL的原始输出是: file:///var/mobile/Applications/F14AFBD8-FF60-4094-8BBD-7AC2477E0B20/Documents/1.%20AKTIV%20SA%CC%88LJFOLDER/Sa%CC%88ljfolder2014-SP1.pdf

对于NSString: /var/mobile/Applications/F14AFBD8-FF60-4094-8BBD-7AC2477E0B20/Documents/1. AKTIV SÄLJFOLDER/Säljfolder2014-SP1.pdf

如果我在NSURL上运行stringByRemovingPercentEncoding,看起来相同,但它们不进行比较。

如果我向NSString运行stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding,我会file:///var/mobile/Applications/F14AFBD8-FF60-4094-8BBD-7AC2477E0B20/Documents/nestle/1.%20AKTIV%20S%C3%84LJFOLDER/S%C3%A4ljfolder2014-SP1.pdf

请注意,网址上的百分比不同。我已经尝试了很多东西,改变了编码等但却无法找到解决这个问题的方法。


修改

所以,我尝试了precomposedStringWithCanonicalMapping如下: NSLog(@"EQUAL? :%hhd", [[strippedUrlString precomposedStringWithCanonicalMapping] isEqualToString:[filePath precomposedStringWithCanonicalMapping]]); - 返回0

我记录了字符串并得到了

/Users/xxxxxx/Library/Application Support/iPhone Simulator/7.0/Applications/C05E0885-7B58-4B2F-A6B4-D9388E60462C/Documents/1. AKTIV SÄLJFOLDER/Säljfolder2014-SP1.pdfNSLog(@"Precompose url 1: %@", [strippedUrlString precomposedStringWithCanonicalMapping]);

表示第一个字符串和

/Users/xxxxxx/Library/Application%20Support/iPhone%20Simulator/7.0/Applications/C05E0885-7B58-4B2F-A6B4-D9388E60462C/Documents/1.%20AKTIV%20SA%CC%88LJFOLDER/Sa%CC%88ljfolder2014-SP1.pdfNSLog(@"Precompose file 1: %@", [filePath precomposedStringWithCanonicalMapping]);

第二个。

尝试使用相同的代码,但使用precomposedStringWithCompatibilityMapping并得到完全相同的结果:(

1 个答案:

答案 0 :(得分:2)

可能你遇到的问题是,Unicode等效字符串并不总是二进制相等。

http://en.wikipedia.org/wiki/Unicode_equivalence

你有

  1. …SA%CC%88…: 这就是问题。 这意味着:我们有一个“A”和一个组合的分音符 - >一个。分音符是0xCC88,对于Unicode 0x0308(COMBINING DIAERESIS)是UTF-8。因此Ä被编码为具有组合分音符的A。

  2. …S%C3%84…: 这很简单。对于0x00C4,0xC384是UTF-8,这意味着A-Umlaut - > A

  3. 首先:第一个字符串的来源是什么?

    添加:您可以使用precomposedStringWith…MappingNSString)。

    BTW:您可以使用-compare:withOptions:等来比较没有变音符号的字符串。使用选项NSDiacriticInsensitiveSearch。在这种情况下,我假设,字符串1等于字符串2.它也会等于“A”,这可能不是你想要的。