Html構文を取得後、UTF8に変換する際の注意点
アップルのサイトにWebサイトをフェッチ(Fetch)する時のサンプルとして以下のコードを載せている。
しかし、このコード内には推奨されない関数が使われている。
Sample
func startLoad() {
let url = URL(string: "https://www.example.com/")!
let task = URLSession.shared.dataTask(with: url) { data, response, error in
if let error = error {
self.handleClientError(error)
return
}
guard let httpResponse = response as? HTTPURLResponse,
(200...299).contains(httpResponse.statusCode) else {
self.handleServerError(response)
return
}
if let mimeType = httpResponse.mimeType, mimeType == "text/html",
let data = data,
let string = String(data: data, encoding: .utf8) {
DispatchQueue.main.async {
self.webView.loadHTMLString(string, baseURL: url)
}
}
}
task.resume()
}
このサンプルコードはサンプルWebサイトのhtml文をData型で取得しUTF8にエンコードしてStringに変換している。
では使うべきでない関数は何かというと、utf8にエンコードするときのこの構文だ。
let string = String(data: data, encoding: .utf8)
Dataからutf8に変換できない文字が1つでもあれば、Stringはnilを返す。しかし、本来なら変換できない文字を文字化けさせてでもStringで返すべき処理なのではないだろうか? 一般的にこの関数を使用していて変換できない文字に遭遇した場合、nilに対する処理をしていないので、そこでプログラムはクラッシュする。これを避けるために次の関数を代わりに使用する。
let string = String(decoding: data, as: UTF8.self)