2008年11月09日
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 じゃなくても同じようなコードで対処できそう。
関連:
- UTF-8 の正規表現は 404 Blog Not Found:UTF-8 vs. ISO-10646 から拝借した
- PHP なら $xmlStr = mb_convert_encoding($xmlStr, "UTF-8", "UTF-8"); でいけるらしい(参考:はてなブックマーク - rssに非UTF8の不正な文字列がある場合の対処法)