> On May 11, 2017, at 5:17 PM, Andrey Fidrya <a...@zabiyaka.com> wrote:
> 
>> 
>> On 12 May 2017, at 00:05, Tony Parker <anthony.par...@apple.com 
>> <mailto:anthony.par...@apple.com>> wrote:
>> 
>>> On May 10, 2017, at 4:19 AM, Andrey Fidrya via swift-corelibs-dev 
>>> <swift-corelibs-dev@swift.org <mailto:swift-corelibs-dev@swift.org>> wrote:
>>> 
>>> Hi All,
>>> 
>>> Btw, when migrating from NSString's methods to URL I've noticed
>>> that they work a bit differently: URL's methods convert strings
>>> from NFC to NFD (decomposed) unicode form which is demonstrated
>>> by the example below.
>>> 
>>> I had to additionally call .precomposedStringWithCanonicalMapping
>>> on resulting string to convert it back to NFC form.
>>> 
>>> This was very surprising as it wasn't mentioned anywhere in docs
>>> and has broken non-english filename support in app.
>> 
>> Out of curiosity, can you explain how this breaks your non-english filename 
>> support? What OS and filesystem are you using?
> 
> OS X, HFS+. The app reconstructed account names from filenames by dropping 
> file extensions. The filename was converted to NFC form once then NSString's 
> methods were used for manipulating the filename. These methods weren't 
> denormalizing the string. After switching to URL the resulting account names 
> started triggering warnings about invalid characters in them ('й' should have 
> been a valid character, but after denormalizing it was no longer found).
> 
> - Andrey

Thanks Andrey. Since this is on Mac, I filed a bug for you in our internal 
system to follow up on this (32156825).

- Tony

> 
>> 
>> - Tony
>> 
>>> Is this expected behavior or a bug?
>>> 
>>> //let source = "/my_file.txt"
>>> let source = "/мой_файл.txt" // problematic is letter 'й'
>>> 
>>> let disallowedCharacters = CharacterSet(charactersIn: source).inverted
>>> 
>>> 
>>> do {
>>>     print("--- NSString:")
>>>     let result = (source as NSString).deletingPathExtension as String
>>>     print(result)
>>>     print(result.rangeOfCharacter(from: disallowedCharacters))
>>> 
>>> }
>>> 
>>> do {
>>>     print("--- String + URL:")
>>>     let result = URL(fileURLWithPath: source).deletingPathExtension().path
>>>     print(result)
>>>     print(result.rangeOfCharacter(from: disallowedCharacters))
>>>     
>>> print(result.precomposedStringWithCanonicalMapping.rangeOfCharacter(from: 
>>> disallowedCharacters))
>>> }
>>> 
>>> 
>>> --- Output:
>>> 
>>> --- NSString:
>>> /мой_файл
>>> nil
>>> --- String + URL:
>>> /мой_файл
>>> Optional(Range(Swift.String.CharacterView.Index(_base: 
>>> Swift.String.UnicodeScalarView.Index(_position: 3), _countUTF16: 
>>> 2)..<Swift.String.CharacterView.Index(_base: 
>>> Swift.String.UnicodeScalarView.Index(_position: 4), _countUTF16: 1)))
>>> nil
>>> 
>>> 
>>> Regards,
>>> Andrey
>>> 
>>>> On 10 May 2017, at 12:45, Eric Blachère via swift-corelibs-dev 
>>>> <swift-corelibs-dev@swift.org <mailto:swift-corelibs-dev@swift.org>> wrote:
>>>> 
>>>> Thanks for the answer ! It seems a bit weird from them to advocate using 
>>>> NSString methods in the unavailability comment. I would rather use URL 
>>>> when I can even if the conversions are a bit tedious ^^
>>>> 
>>>> Thanks a lot,
>>>> Eric
>>>> 
>>>> 2017-05-10 10:52 GMT+02:00 Brent Royal-Gordon <br...@architechies.com 
>>>> <mailto:br...@architechies.com>>:
>>>> > On May 8, 2017, at 9:39 AM, Eric Blachère via swift-corelibs-dev 
>>>> > <swift-corelibs-dev@swift.org <mailto:swift-corelibs-dev@swift.org>> 
>>>> > wrote:
>>>> >
>>>> > I was just wondering if there are plans to bring NSString functions 
>>>> > manipulating paths into the native String class. (such as 
>>>> > lastPathComponent, pathComponents etc...)
>>>> > Because even if we can always make an extension of String to easily cast 
>>>> > it into NSString, it's still a bit of a shame to have to do it ;)
>>>> 
>>>> Unfortunately, it seems like the decision not to include these methods on 
>>>> String was quite deliberate.
>>>> 
>>>> Here's the revision where that happened: 
>>>> <https://github.com/apple/swift/commit/1f2390f1c75be65f57f189247bfe4f9b2fc11e3b#diff-d38f60064c3752f096c043e756d8f201R925
>>>>  
>>>> <https://github.com/apple/swift/commit/1f2390f1c75be65f57f189247bfe4f9b2fc11e3b#diff-d38f60064c3752f096c043e756d8f201R925>>
>>>>  As you can see, they had that working and chose to disable it, presumably 
>>>> because they want you to manipulate paths through `URL`. (I wish the radar 
>>>> referenced in the commit message were public, but alas, it's not.)
>>>> 
>>>> --
>>>> Brent Royal-Gordon
>>>> Architechies
>>>> 
>>>> 
>>>> _______________________________________________
>>>> swift-corelibs-dev mailing list
>>>> swift-corelibs-dev@swift.org <mailto:swift-corelibs-dev@swift.org>
>>>> https://lists.swift.org/mailman/listinfo/swift-corelibs-dev 
>>>> <https://lists.swift.org/mailman/listinfo/swift-corelibs-dev>
>>> 
>>> _______________________________________________
>>> swift-corelibs-dev mailing list
>>> swift-corelibs-dev@swift.org <mailto:swift-corelibs-dev@swift.org>
>>> https://lists.swift.org/mailman/listinfo/swift-corelibs-dev 
>>> <https://lists.swift.org/mailman/listinfo/swift-corelibs-dev>
_______________________________________________
swift-corelibs-dev mailing list
swift-corelibs-dev@swift.org
https://lists.swift.org/mailman/listinfo/swift-corelibs-dev

Reply via email to