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)
}
}
…这奏效了。这有点极端,但希望这能帮助其他遇到同样问题的可怜人。
我正在 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)
}
}
…这奏效了。这有点极端,但希望这能帮助其他遇到同样问题的可怜人。