代码之家  ›  专栏  ›  技术社区  ›  John Pollard

如何用Ruby中的emoji将ASCII字符串转换成UTF 8字符串

  •  -1
  • John Pollard  · 技术社区  · 7 年前
    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”

    1 回复  |  直到 7 年前
        1
  •  0
  •   Aleksei Matiushkin    7 年前

    原始字符串包含7个字节的垃圾 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
    
    推荐文章