UTF-8として不正な文字を除去する -- invalid byte sequence in UTF-8例外を発生させなくするには

タグ: ruby / 公開: 2014-03-25

ネットワークから収集したテキストファイルには、時にUTF-8として不正な文字が含まれている場合がある。 そのような不正な文字列に対して正規表現によるマッチなど何か操作を行おうとすると以下のエラーが発生する。

ArgumentError: invalid byte sequence in UTF-8

このエラーを発生させないようにするには、文字列からUTF-8として不正な文字を除去しなければならない。

Ruby 1.9では、encodeメソッドに:invalid => replaceオプションを指定して、UTF-8からUTF-8への変換を行えば、不正な文字を除去することができる。

str.encode!('UTF-8', 'UTF-8', :invalid => :replace)

この方法でもまだ不正な文字が除去できない場合は、以下のようにUTF-16を経由する方法を試してみると良い。

str.encode!('UTF-16', 'UTF-8', :invalid => :replace, :replace => '')
str.encode!('UTF-8', 'UTF-16')

Ruby 1.8では、encodeメソッドが使用できないため、iconvライブラリを利用して以下のようにする。

require 'iconv'
iconv = Iconv.new('UTF-8', 'UTF-8//IGNORE')
str = iconv.iconv(str)

参考

この記事をSNSでシェアする
タイトルとURLをコピーする
または投稿画面を開く
Author
Icon
ぺけみさお / xmisao
プログラマ。
Subscription
Recent articles
Related to ruby