やりたいこと
本当は SJIS (CP932) のはずなのにエンコーディングが UTF-8 と解釈されている文字列を、SJIS と判断した上で UTF-8 に変換したい。
str = '米津玄師'.encode(Encoding::SJIS).force_encoding(Encoding::UTF_8)
#=> "\x95ĒÌ\xBA\x8Et"
str.encoding
#=> #<Encoding:UTF-8>
str.encode(Encoding::UTF_8)
#=> "\x95ĒÌ\xBA\x8Et"
# ???
#=> "米津玄師"
方法
NKF.guess と String#encode (第 2 引数に変換元のエンコーディングを指定する) を使う。
require 'nkf'
str = '米津玄師'.encode(Encoding::SJIS).force_encoding(Encoding::UTF_8)
str.encode(Encoding::UTF_8, NKF.guess(str)) # NKF.guess(str) #=> #<Encoding:Shift_JIS>
#=> "米津玄師"
str = '米津玄師'
str.encode(Encoding::UTF_8, NKF.guess(str))
#=> "米津玄師"