LoginSignup
1
1

More than 5 years have passed since last update.

[Crystal] HTTP::Clientで(UTF-8的に)不正なバイト列が紛れた文字列をダウンロードする

Posted at

メモ

url がUTF-8的に不正なバイト列を含む文字列を返してくる場合,普通に HTTP::Client::Response から body を取り出そうとするとエラーになる。

data = HTTP::Client.get(url).body # => invalid encoding: "utf-8" (ArgumentError)

こんなとき get なり post なりをブロック付きで呼ぶと,ブロック引数で渡される HTTP::Client::Response オブジェクトに対して IO 型の #body_io が使えるようになるので,IO#set_encoding で不正なバイト列を明示的にスキップさせるようにすれば,とりあえずエラーは回避可能。

data = HTTP::Client.get(url) do |res|
  res.body_io.set_encoding("utf-8", :skip)
  res.body_io.get_to_end
end
1
1
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
1
1