iOS: NSString (данные: NSData, кодировка: UInt) не работает с некоторыми символами

Я извлекаю XML-файл по сети в своем XML-приложении. Я знаю, что файл должен быть закодирован с использованием ISO-8859-1.

Поэтому я пытаюсь расшифровать его, когда вытаскиваю:

func extractXMLFromHttpResponse(data: NSData) -> XMLIndexer {

    let xmlContent = NSString(data: data, encoding: NSISOLatin1StringEncoding)!

    print(xmlContent)
    return SWXMLHash.parse(xmlContent as String) 
}

Примечание. XMLIndexer взят из библиотеки SWXMLHash, что упрощает синтаксический анализ XML.

Однако при печати NSString на моей консоли отладки я замечаю, что некоторые специальные символы (испанский), такие как

'ñ' or 'é'

не декодируются должным образом.

В результате процесса декодирования вместо байтов я вижу текст. Первая строка:

<?xml version="1.0" encoding="ISO-8859-1"?>

Итак, я думаю, я выбрал правильную кодировку. Однако я не понимаю, почему некоторые символы не могут быть декодированы. Я делаю что-то не так, когда расшифровываю данные?

Странно то, что если я делаю запрос GET вручную и просматриваю файл в браузере, ошибок декодирования не возникает.

ИЗМЕНИТЬ:

Как предположил TwoStraws в своем комментарии, я сделал запрос на завивку. Он возвращает мне следующее:

HTTP/1.1 200 ОК

Кэш-Контроль: частный

Длина содержимого: 75030

Тип содержимого: текст/xml

Истекает: ср, 16 декабря 2015 г., 09:13:05 по Гринвичу.

Сервер: Microsoft-IIS/7.5

Set-Cookie: ...; путь=/

X-Powered-By: ASP.NET

Дата: среда, 16 декабря 2015 г., 09:13:05 по Гринвичу

даже если я сделаю

curl -v "http://www.example.com/webserviceGetCall"

в нем не указано, как кодируется файл xml. Что это значит? Я думал, что он также должен возвращать кодировку в описании Content-type.


person productioncoder    schedule 15.12.2015    source источник
comment
Попробуйте запустить curl -I "http://yoursite.com/whatever.xml" в окне терминала, чтобы убедиться, что контент действительно отправляется в формате ISO-8859-1. XML может говорить что угодно, это просто текст. Лучше убедиться!   -  person TwoStraws    schedule 15.12.2015
comment
@TwoStraws спасибо за ваш ответ. Я обновил вопрос.   -  person productioncoder    schedule 16.12.2015
comment
Поскольку вы получаете его из URL-адреса, не могли бы вы вместо этого попробовать этот код? Извините, комментарии - очень плохое место для размещения кода! if let url = NSURL(string: yoursite.com/file.xml) { if let str = try ? NSString(contentsOfURL: url, usedEncoding: nil) { // здесь была проанализирована ваша строка? } }   -  person TwoStraws    schedule 16.12.2015
comment
Разница в том, что этот код просит iOS определить для вас кодировку. Это зависит от того, вынуждены ли вы работать с NSData или нет.   -  person TwoStraws    schedule 16.12.2015
comment
К сожалению, это тоже не работает. Я установил точку останова во втором операторе if, и программа не останавливается.   -  person productioncoder    schedule 16.12.2015
comment
Можете ли вы опубликовать URL-адрес XML, который вы получаете? Или по электронной почте мне лично по адресу [email protected]?   -  person TwoStraws    schedule 16.12.2015
comment
Я отправил вам электронное письмо.   -  person productioncoder    schedule 16.12.2015


Ответы (1)


Итак, с некоторой диагностикой мы обнаружили, что проблема заключалась в том, что сервер говорил одну кодировку набора символов, а XML говорил другую, и iOS изо всех сил пыталась согласовать это.

В итоге мы использовали следующее решение:

if let url = NSURL(string: "http://example.com/path/to/xml/file") {
    do {
        let str = try NSString(contentsOfURL: url, encoding: NSISOLatin1StringEncoding)
        print(str)
    } catch let e as NSError {
        print(e.localizedDescription)
    }
}

…и это сработало. Это немного угловой случай, но, надеюсь, это поможет какой-нибудь другой бедняге, столкнувшейся с той же проблемой.

person TwoStraws    schedule 16.12.2015