2015-12-15 39 views
1

我在XML应用程序中通过网络拉取XML文件。 我知道该文件应该使用ISO-8859-1进行编码。iOS:NSString(数据:NSData,编码:UInt)在某些字符处失败

所以我尝试当我把它给它解码:

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我调试控制台不过的时候,我注意到,一些特殊字符(西班牙),如

“n”或“E”

不能正确解码。

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

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

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

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

编辑:

由于TwoStraws在他的评论所说,我做了卷曲的要求。它返回我下面的:

HTTP/1.1 200 OK

的Cache-Control:私人

的Content-Length:75030

内容类型:文本/ XML

到期时间:2015年12月16日星期三09:13:05 GMT

服务器:Microsoft-IIS/7.5

Set-Cookie:...;路径=/

X-已启动方式:ASP.NET

日期:星期三,2015年12月16日9时13分05秒GMT

即使我我

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

它没有说明如何编码xml文件。那是什么意思?我认为它应该返回编码以及Content-type描述。

+2

尝试在终端窗口中运行'curl -I“http://yoursite.com/whatever.xml”'以确保ISO-8859-1中的内容实际上被*发送*。 XML可以说任何想要的,它只是文本。最好确定! – TwoStraws

+0

@TwoStraws感谢您的回答。我更新了这个问题。 – slashburn

+1

当你从URL中获取它时,你可以试试这个代码吗?对不起,评论对我来说是非常差的地方发布代码! \t if let url = NSURL(string:“http://yoursite.com/file.xml”){ \t \t if let str = try? NSString(contentsOfURL:url,usedEncoding:nil){ \t \t \t //你的字符串在这里被解析了吗? \t \t} \t} – TwoStraws

回答

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

...这工作。这是一个角落案件,但希望这将帮助其他可能遇到同样问题的可怜的灵魂。

相关问题