iOS:NSString(数据:NSData,编码:UInt)在某些字符处失败

标签 ios xml xml-parsing nsstring nsstringencoding

我在我的 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/

相关文章:

ios - 从父类访问变量

ios:从 subview Controller 获取父弹出窗口的大小?

c++ - 哪一行 XML 无效

xml - 解析 XML,报告未知标签/属性

coldfusion - 在 ColdFusion 中将 XML 对象转换回字符串

ios - 地理围栏 iOS 6

ios - firebase 会自动设置 apns-push-type header 吗?

c# - 如何将sql server数据库schema加上所有表中的数据转换成xml格式

java - float Action 按钮点击时会跳转

java - 在 Java 中解析 HTML 页面