我在我的 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 library这使得 XML 解析更容易。
然而,当将 NSString 打印到我的调试控制台时,我注意到一些特殊字符(西类牙语),例如
'ñ' or 'é'
未正确解码。
作为解码过程的结果,我看到的是文本而不是字节。第一行是:
<?xml version="1.0" encoding="ISO-8859-1"?>
所以我想,我选择了正确的编码。但是我不明白为什么有些字符无法解码。我在解码数据时是否做错了什么?
奇怪的是,如果我手动执行 GET 请求并在浏览器中查看文件,则没有解码错误。
编辑:
正如 TwoStraws 在他的评论中所建议的那样,我提出了 curl 请求。它返回以下内容:
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 文件是如何编码的。这意味着什么?我认为它应该在内容类型描述中也返回编码。
最佳答案
因此,通过一些诊断,我们发现问题是服务器说的是一种字符集编码,而 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)
}
}
……这奏效了。这有点极端,但希望这能帮助其他遇到同样问题的可怜人。
关于iOS:NSString(数据:NSData,编码:UInt)在某些字符处失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34298097/