ios - 为什么该网站无法在 Swift URLSession 中转换为 UTF8?
问题描述
以下代码失败:
let url = URL(string: "https://www.cardboardconnection.com/1987-topps-baseball-cards")!
var request = URLRequest(url: url)
request.setValue("text/html; charset=utf-8", forHTTPHeaderField: "Content-Type")
request.setValue("text/html; charset=utf-8", forHTTPHeaderField: "Accept")
let task = URLSession.shared.dataTask(with: request) {(data, response, error) in
guard let data = data else { return }
print(String(data: data, encoding: .utf8)!)
}
task.resume()
我无法弄清楚这个单独的网站具体是什么导致它在 UTF8 转换上失败。我该如何解决这个问题?什么是正确的转换?只是想从页面中获取原始 HTML。
解决方案
使用如何在文本文件中检测无效 utf8 unicode/binary的技巧
curl -s https://www.cardboardconnection.com/1987-topps-baseball-cards | grep -axv '.*'
这将显示两行具有无效 UTF-8 的行。这里的技巧是.
只匹配合法解码的字符。
以下工作,但感觉就像我错过了更简单的方法来做到这一点。
var codeUnits: [UTF32.CodeUnit] = []
let sink = { codeUnits.append($0) }
if transcode(data.makeIterator(), from: UTF8.self, to: UTF32.self,
stoppingOnError: false, into: sink) {
let string = String(codeUnits.compactMap { UnicodeScalar($0) }.map(String.init).joined())
print(string)
}
另请参阅https://stackoverflow.com/a/44611946/97337,Martin R 以更好的方式解决了这个问题(尽管它仍然不简单)。
推荐阅读
- java - 如何在 CardView 的 GridView 中显示字符串数组
- python - 如何使用 JQuery 访问 WTForm
- arrays - 单个 json 输出中的多个列表
- cassandra - 更新 cassandra 中的用户定义类型数据
- hibernate - 如何将 JavaFX8 DatePicker 绑定到 java.sql.Date 实体属性
- sql - Oracle Query - 将列值作为多个值的列标题
- laravel - Laravel 文本超出段落
- javascript - 登录成功后如何使用 ReactJS 重定向到仪表板?
- sql - 基于列值的 SQL 查询
- blockchain - 区块链如何提供多样化的数据库存储?