Ruby では、CP932 でも正常に動く。
一旦、UTF-8 へ変換して処理してから、またCP932へ変換しているのかな?

str_utf8 = "aあbいc"
p str_utf8.encoding #=> <Encoding:UTF-8>

str_cp932 = str_utf8.encode( Encoding::CP932 )
p str_cp932.encoding #=> <Encoding:Windows-31J>

p str_utf8[1, 3] # インデックス1 から、3文字分
#=> "あbい"

p slice_cp932 = str_cp932[1, 3] #=> "\x{82A0}b\x{82A2}"
p slice_cp932.encoding #=> <Encoding:Windows-31J>

p slice_utf8 = slice_cp932.encode( Encoding::UTF_8 ) #=> "あbい"
p slice_utf8.encoding #=> <Encoding:UTF-8>