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
原始字符串如下所示:“我的****章***** EEEEEEE”
答案 0 :(得分:0)
您的原始字符串包含7个字节的垃圾,BOM
,然后是目标字符串scanf
。
UTF_16LE
在所有情况下,您的 string 最有可能以puts text[9..-1].force_encoding(Encoding::UTF_16LE).encode(Encoding::UTF_8)
#⇒ My ****CHAPTER***** EEEEEEE
开头。要检测到它,您可以使用:
BOM
然后:
_, idx =
text.chars.each_cons(2).with_index.detect do |(c1, c2), _|
c1 == "\xFF" && c2 == "\xFE"
end