Ruby で UTF-8 の文字化け部分を取り除く

RSS を拾ってきてパースしようとしたら、不正な文字列が入っていて REXML が ParseException を投げてしまった。

文字コードが UTF-8 前提だったので、UTF-8 として valid な文字のみが含まれるように置換して対処した。

str = str.scan(/([\x00-\x7f]|[\xC0-\xDF][\x80-\xBF]|[\xE0-\xEF][\x80-\xBF]{2}|[\xF0-\xF7][\x80-\xBF]{3})/).join

Ruby じゃなくても同じようなコードで対処できそう。

関連: