iOS: NSString(data: NSData, encoding: UInt) 在某些字符处失败

iOS: NSString(data: NSData, encoding: UInt) fails at some characters

我正在 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) 
}

注意:XML索引器来自 SWXMLHash library,这使得 XML 解析更容易。

然而,当将 NSString 打印到我的调试控制台时,我注意到一些特殊字符(西班牙语),例如

'ñ' or 'é'

未正确解码。

由于解码过程,我看到的是文本而不是字节。第一行是:

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

所以我想,我选择了正确的编码。但是我不明白为什么有些字符无法解码。我解码数据的时候是不是做错了什么?

奇怪的是,如果我手动执行 GET 请求并在浏览器中查看文件,则没有解码错误。

编辑:

正如 TwoStraws 在他的评论中所建议的那样,我提出了 curl 请求。它 return 对我来说如下:

HTTP/1.1 200 OK

Cache-Control: private

Content-Length: 75030

Content-Type: text/xml

Expires: Wed, 16 Dec 2015 09:13:05 GMT

Server: Microsoft-IIS/7.5

Set-Cookie: ...; path=/

X-Powered-By: ASP.NET

Date: Wed, 16 Dec 2015 09:13:05 GMT

我就算了

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

它没有说明 xml 文件是如何编码的。那是什么意思?我认为它应该 return 编码以及内容类型描述。

因此,通过一些诊断我们发现问题是服务器说的是一种字符集编码,而 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)
    }
}

…这奏效了。这有点极端,但希望这能帮助其他遇到同样问题的可怜人。