【问题标题】:iOS correct comparison of file pathsiOS 正确比较文件路径
【发布时间】:2014-02-28 03:23:46
【问题描述】:

我在编写的应用程序中遇到问题,我需要比较一个指向文件的 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.pdf NSLog(@"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.pdf NSLog(@"Precompose file 1: %@", [filePath precomposedStringWithCanonicalMapping]);

第二次。

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

【问题讨论】:

  • 代码中的 URL 是否有 file:// 作为前缀?如果是,它们将不一样。
  • 谢谢,但我也尝试将 file:// 前缀添加到 NSString 并进行比较,还从 URL 中删除了 file:// ——但仍然无法比较它们:(
  • 您如何比较它们,您可以发布代码吗?
  • 我尝试了很多比较方法,但似乎字符串不匹配:[filePath isEqualToString:[document.fileURL absolutePath]]

标签: ios objective-c nsstring nsurl


【解决方案1】:

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

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

你有

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

  2. …S%C3%84…: 这很容易。 0xC384 是 0x00C4 的 UTF-8,这意味着 A-Umlaut -> Ä

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

补充:可以使用precomposedStringWith…MappingNSString)。

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

【讨论】:

  • 非常感谢! :) 第一个字符串是从 plist 中取消归档的。那么——如果它们是二进制不相等的,我该如何比较这两个字符串呢?我得到了 compare 方法,但正如你所说,它有效,但当然会导致问题。
  • 看看我的补充:有一些 precompose.../decompose... 方法应该可以工作。他们做了一些标准化。如果它们不起作用,请在此处报告。
  • 您好,再次感谢。恐怕我得到了相同的输出,至少在 NsLogging 时是这样。我尝试了precomposedStringWithCompatibilityMappingdecomposedStringWithCompatibilityMappingprecomposedStringWithCanonicalMappingdecomposedStringWithCanonicalMapping。有什么想法吗?
  • 请将您尝试的结果添加到您的 Q 中。A 看到一大群人说“我尝试过……”。最好准确地显示您尝试过的结果。
  • :-( 你试过分解吗?(相同的选择器,但开头是“de”而不是“pre”。)
猜你喜欢
  • 2022-01-19
  • 2014-06-09
  • 2012-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-28
  • 1970-01-01
相关资源
最近更新 更多