如何在Ruby中使用表情符号将ASCII字符串转换为UTF 8字符串

时间:2018-08-16 16:21:20

标签: ruby encoding character-encoding

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”

1 个答案:

答案 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