0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Html構文を取得後、UTF8に変換する際の注意点

Posted at

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)

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?