user951406
user951406

Reputation: 11

iOS correct comparison of file paths

I have an issue in an application I'm writing where I need to compare one NSURL that points to a file and an NSString, which is an incoming string representation of the same file path.

I can't get them to compare – the output I'm given when NSLogging is confusing, perhaps it is a encoding issue?

I can make them look the same with this code: [urlString stringByRemovingPercentEncoding];

The raw output for the NSURL is: file:///var/mobile/Applications/F14AFBD8-FF60-4094-8BBD-7AC2477E0B20/Documents/1.%20AKTIV%20SA%CC%88LJFOLDER/Sa%CC%88ljfolder2014-SP1.pdf

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

If I run stringByRemovingPercentEncoding on the NSURL it looks the same, but they don't compare.

If I run stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding to the NSString I get file:///var/mobile/Applications/F14AFBD8-FF60-4094-8BBD-7AC2477E0B20/Documents/nestle/1.%20AKTIV%20S%C3%84LJFOLDER/S%C3%A4ljfolder2014-SP1.pdf

Note that the percentages is not the same on the urls. I have tried so many things, changing encodings etc. but can't find a way to solve this.


Edit

So, I tried the precomposedStringWithCanonicalMapping as follows: NSLog(@"EQUAL? :%hhd", [[strippedUrlString precomposedStringWithCanonicalMapping] isEqualToString:[filePath precomposedStringWithCanonicalMapping]]); – returns 0

I logged the strings and got

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

for the first string and

/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 with NSLog(@"Precompose file 1: %@", [filePath precomposedStringWithCanonicalMapping]);

for the second.

Tried same code, but with precomposedStringWithCompatibilityMapping and got exactly the same result :(

Upvotes: 1

Views: 580

Answers (1)

Amin Negm-Awad
Amin Negm-Awad

Reputation: 16650

Probably you ran in a problem that in Unicode equivalent strings are not always binary equal.

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

You have

  1. …SA%CC%88…: This is the problem. It means: We have an "A" and a combining diaeresis -> Ä. The diaeresis is the 0xCC88, which is UTF-8 for Unicode 0x0308 (COMBINING DIAERESIS). So the Ä is encoded as an A with an combining diaeresis.

  2. …S%C3%84…: This is easy. 0xC384 is UTF-8 for 0x00C4 that means A-Umlaut -> Ä

First of all: What is the source of the first string?

Addition: You can use precomposedStringWith…Mapping (NSString).

BTW: You can compare strings without diacritic marks using -compare:withOptions: et al. with the option NSDiacriticInsensitiveSearch. In this case, I assume, string 1 equals string 2. Butt it would equal an "A", too, what is probably not what you want.

Upvotes: 2

Related Questions