1

我在我的 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 来自于使 XML 解析更容易的SWXMLHash 库。

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

'ñ' 或 'é'

没有正确解码。

作为解码过程的结果,我看到的是文本而不是字节。第一行是:

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

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

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

编辑:

正如 TwoStraws 在他的评论中建议的那样,我提出了 curl 请求。它返回给我以下信息:

HTTP/1.1 200 正常

缓存控制:私有

内容长度:75030

内容类型:文本/xml

过期:2015 年 12 月 16 日星期三 09:13:05 GMT

服务器:Microsoft-IIS/7.5

设置 Cookie: ...; 路径=/

X-Powered-By: ASP.NET

日期:格林威治标准时间 2015 年 12 月 16 日星期三 09:13:05

即使我这样做

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

它没有说明 xml 文件是如何编码的。这意味着什么?我认为它也应该在 Content-type 描述中返回编码。

4

1 回答 1

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)
    }
}

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

于 2015-12-16T11:35:56.320 回答