使用NSUTF8StringEncoding将NSData转换为NSString不适用于特殊字符

时间:2016-02-23 14:09:20

标签: ios swift encoding nsstring

我想解析一个CSV文件来创建一个String。

我使用Dropbox API获取数据。假设我的CSV文件包含一个简单的单词:“école”。当我尝试创建一个String时,我收到错误:fatal error: unexpectedly found nil while unwrapping an Optional value

我的代码:

client.files.download(path: "/\(selectedFile)", destination: destination).response { response, error in
    if let (_, url) = response {
        let data = NSData(contentsOfURL: url)

        print("data: \(data!)")

        let myString = NSString(data: data!, encoding: NSUTF8StringEncoding) as! String

        let csv = CSwiftV(String: myString)        
    } else {
        print(error!)
    }
}

print("data: \(data!)")效果很好,打印出一串十六进制。所以我理解我的数据不是零(对吧?)。

如果我的CSV文件中包含单词“ ecole ”而不是“école”,那么它的效果非常好。但据我所知,UTF-8编码应该支持特殊字符吗?

1 个答案:

答案 0 :(得分:1)

这意味着您的数据使用其他代码进行编码,而NSUTF8StringEncoding使用相同的编码对其进行解码 例如

let string = "école"
let data = string.dataUsingEncoding(NSUTF8StringEncoding)
let myString = NSString(data: data!, encoding: NSUTF8StringEncoding) as! String //This is OK

let string = "école"
let data = string.dataUsingEncoding(NSUnicodeStringEncoding)
let myString = NSString(data: data!, encoding: NSUTF8StringEncoding) as! String // This will not work and myString will be nil

请尽量避免强行打开(!),即使您确定自己有数据,因为下次使用时可能会发生崩溃!

我会这样做:

 guard let data = NSData(contentsOfURL: url),
       let myString = NSString(data: data, encoding: NSUTF8StringEncoding) else {
 print("something terrible happened treat error")
}
 let csv = CSwiftV(String: String(myString))