iOS文件路径的正确比较

iOS文件路径的正确比较,ios,objective-c,nsstring,nsurl,Ios,Objective C,Nsstring,Nsurl,我在编写的应用程序中遇到了一个问题,我需要比较一个指向文件的NSURL和一个NSString,NSString是同一文件路径的传入字符串表示形式 我无法让他们进行比较——当NSLogging让人困惑时,我给出的输出可能是编码问题 我可以使用以下代码使它们看起来相同:[urlstringbyremovingpercentencoding] NSURL的原始输出为: file:///var/mobile/Applications/F14AFBD8-FF60-4094-8BBD-7AC2477E0B2

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

我无法让他们进行比较——当NSLogging让人困惑时,我给出的输出可能是编码问题

我可以使用以下代码使它们看起来相同:
[urlstringbyremovingpercentencoding]

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,它看起来是一样的,但它们不进行比较

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

请注意,URL上的百分比不同。我尝试了很多事情,改变了编码等等,但是找不到解决这个问题的方法


编辑 因此,我使用CanonicalMapping尝试了
预组合Strings,如下所示:
NSLog(@“EQUAL:%hhd)”,[[strippedUrlString precomposedStringWithCanonicalMapping]IsequalString:[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.pdf
使用
NSLog(@“预合成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.pdf
使用
NSLog(@“预合成文件1:%@,[filePath precomposedStringWithCanonicalMapping])

第二次


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

可能您遇到了一个问题,即在Unicode中,等效字符串并不总是二进制相等

你有

  • …SA%CC%88…
    : 这就是问题所在。 它的意思是:我们有一个“A”和一个组合分隔符->Ä。分隔符是0xCC88,它是Unicode 0x0308(组合分隔符)的UTF-8。因此,Ä被编码为带有组合分隔符的A

  • …S%C3%84…
    : 这很简单。0xC384是0x00C4的UTF-8,表示A-Umlaut->Ä

  • 首先:第一个字符串的来源是什么

    添加:您可以使用
    precomposedStringWith…Mapping
    NSString


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

    代码中的URL是否有file://作为前缀?如果是,它们将不相同。谢谢,但我也尝试将file://前缀添加到NSString并进行比较,还从URL中删除了file://但仍然无法进行比较:(您是如何比较它们的,可以发布代码吗?我尝试了很多比较方法,但字符串似乎不匹配:
    [filePath isEqualToString:[document.fileURL absolutePath]]
    非常感谢!:)第一个字符串未从plist中归档。那么–如果这两个字符串是二进制不相等的,我该如何进行比较呢?我使用了compare方法,但正如您所说的,它可以工作,但当然会导致问题。请看我的补充:有一些precompose…/decompose…方法应该可以工作。它们会进行一些规范化。我如果它们不起作用,请在此报告。您好,再次感谢。恐怕我得到了相同的输出,至少在登录时是这样。我尝试了
    precomposedStringWithCompatibilityMapping
    decomposedStringWithCompatibilityMapping
    precomposedStringWithCanonicalMapping
    decomposedStringWithCanonicalMapping
    .有什么想法吗?请将您尝试的结果添加到您的问题中。A看到一大群人在说“我尝试了…”。最好准确地显示您尝试了哪些结果。:-(您尝试过分解吗?(相同的选择器,但一开始是“de”而不是“pre”。)