バイトオーダーについてメモ

KconvはBOMなしUTF16を既定でビッグエンディアン(BE)とみなします。

Windows(Intel)はリトルエンディアン(LE)なので,BOMなしUTF16(LE)のデータを読み込み,SJIS変換する場合は,

str = "\xff\xfe" + str

のようにLEのBOMを付加するか,Uconvを使って

require 'uconv'
str = Uconv.u16swap(str)

または,

str = str.unpack('n*').pack('v*')

のようにバイトオーダーを入れ替えてから変換する必要があります。

puts str.kconv(Kconv::SJIS, Kconv::UTF16)