Search code examples
swiftstringurlencodeurl-encodingcyrillic

Urlencode cyrillic characters in Swift


I need to convert a cyrillic string to its urlencoded version using Windows-1251 encoding. For the following example string:

Моцарт

The correct result should be:

%CC%EE%F6%E0%F0%F2

I tried addingPercentEncoding(withAllowedCharacters:) but it doesn't work.

How to achieve the desired result in Swift?


Solution

  • NSString has a addingPercentEscapes(using:) method which allows to specify an arbitrary encoding:

    let text = "Моцарт"
    if let encoded = (text as NSString).addingPercentEscapes(using: String.Encoding.windowsCP1251.rawValue) {
        print(encoded)
        // %CC%EE%F6%E0%F0%F2
    }
    

    However, this is deprecated as of iOS 9/macOS 10.11. It causes compiler warnings and may not be available in newer OS versions.

    What you can do instead is to convert the string do Data with the desired encoding, and then convert each byte to the corresponding %NN sequence (using the approach from How to convert Data to hex string in swift):

    let text = "Моцарт"
    if let data = text.data(using: .windowsCP1251) {
        let encoded = data.map { String(format: "%%%02hhX", $0) }.joined()
        print(encoded)
        // %CC%EE%F6%E0%F0%F2
    }