以前に書いた記事の別解です。
結論
String クラスに以下のように sjisable
メソッドを生やします。
class String def sjisable str = self from_chr = "\u{301C 2212 00A2 00A3 00AC 2013 2014 2016 203E 00A0 00F8 203A}" to_chr = "\u{FF5E FF0D FFE0 FFE1 FFE2 FF0D 2015 2225 FFE3 0020 03A6 3009}" str.tr!(from_chr, to_chr) str.encode('Windows-31J', 'UTF-8', invalid: :replace, undef: :replace) end end
あとは String のオブジェクト(要は文字列)にこのメソッドを適用すれば、戻り値が Shift JIS になります。Encoding::UndefinedConversionError
も出ません。
以前に書いた記事に比べて、こちらの方が少し見通しがよいかなと思います。