text = "\x00\x00\x00=\x00\x00\x01\xFF\xFEM\x00y\x00 \x00*\x00*\x00*\x00*\x00C\x00H\x00A\x00P\x00T\x00E\x00R\x00*\x00*\x00*\x00*\x00*\x00 \x00E\x00E\x00E\x00=\xD8\x0E\xDEE\x00E\x00E\x00E\x00" text = text.encode('UTF-8', :invalid => :replace, :undef => :replace) => "\u0000\u0000\u0000=\u0000\u0000\u0001��M\u0000y\u0000 \u0000*\u0000*\u0000*\u0000*\u0000C\u0000H\u0000A\u0000P\u0000T\u0000E\u0000R\u0000*\u0000*\u0000*\u0000*\u0000*\u0000 \u0000E\u0000E\u0000E\u0000=�\u000E�E\u0000E\u0000E\u0000E\u0000" puts "#{text}" =��My ****CHAPTER***** EEE=��EEEE
原来的字符串是这样的“我的****章****eeeeee”
原始字符串包含7个字节的垃圾 BOM UTF_16LE .
BOM
UTF_16LE
puts text[9..-1].force_encoding(Encoding::UTF_16LE).encode(Encoding::UTF_8) #â My ****CHAPTER***** EEEðEEEE
在所有的情况下 一串 开始于 . 要检测它,您可以使用:
_, idx = text.chars.each_cons(2).with_index.detect do |(c1, c2), _| c1 == "\xFF" && c2 == "\xFE" end
puts text[idx+2..-1].force_encoding(Encoding::UTF_16LE).encode(Encoding::UTF_8) #â My ****CHAPTER***** EEEðEEEE