Edited at

[Ruby] SJIS (CP932) のはずなのにエンコーディングが UTF-8 の文字列を UTF-8 に変換する


やりたいこと

本当は 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.guessString#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))
#=> "米津玄師"