【问题标题】:How to read collapsed UTF-8 string如何读取折叠的 UTF-8 字符串
【发布时间】:2017-05-04 02:05:09
【问题描述】:
我正在尝试从此地址读取 JSON
http://www.defense.gov/data.json'
但是这个数据在第2771行包含非法字符0x92,所以
try! String( contentsOf: URL( string: "http://www.defense.gov/data.json" )!, encoding: .utf8 )
以下异常崩溃。
致命错误:“试试!”表达式意外引发错误:错误
Domain=NSCocoaErrorDomain Code=261 "文件“data.json”不能被
使用文本编码 Unicode (UTF-8) 打开。"
用户信息={NSURL=http://www.defense.gov/data.json, NSStringEncoding=4}:
文件 /Library/Caches/com.apple.xbs/Sources/swiftlang/
有没有什么方法可以在不编写我自己的字符串阅读器的情况下从这个站点读取 JSON?
【问题讨论】:
标签:
json
swift
string
macos
encoding
【解决方案1】:
查看内容,除了单个 0x92 之外的所有字符都在 ASCII 范围内(0x00...0x7F)。因此,您可以尝试使用编码 ISO-8859-1(别名 ISO-Latin-1),它将所有字节映射到 U+0000...U+00FF,因此可能不会导致编码问题。
var rawStr = try! String(contentsOf: URL(string: "http://www.defense.gov/data.json")!, encoding: .isoLatin1)
如果需要,您可以删除该字符。
rawStr = rawStr.replacingOccurrences(of: "\u{92}", with: "")
并将其重新编码为有效的 UTF-8 数据:
let dataUTF8 = rawStr.data(using: .utf8)!
可以用JSONSerialization处理重新编码的数据:
let json = try! JSONSerialization.jsonObject(with: dataUTF8) as! [String: Any]
以上所有代码都是出于实验目的而编写的。所有try!、as! 或强制展开 (!) 在这里都不安全,您可能需要在实际应用程序中以更零安全的方式处理它们。而String(contentsOf:) 可能会消耗无限的时间,尤其是在通信不良的环境中。您不应该在实际应用程序的主线程中调用它。