dou4064
dou4064
2019-04-16 03:30
浏览 141

GoLang从文件中加载的Unicode文字打印表情符号

I am attempting to print Unicode emoji characters loaded from a JSON file using GoLang. When I load and unmarshall my file, the struct field passed to fmt.Println, only prints the escaped string sequence. For example, one string is stored within the file as {..."Unicode":"\\U0001f47f"} and printing it yields \U0001f417 and not the emoji character. Calling fmt.Printf("%q", str) yields \\U0001f417. I wasn't able to find a solution and I am bit stumped. I have attempted to remove the escape sequence and concatenate it within a template string, but it has no impact. I also attempted to use a string buffer but it didn't work either. Any advice is very much appreciated!

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

2条回答 默认 最新

  • doucan957495
    doucan957495 2019-04-16 05:15
    已采纳

    Use the following function to convert a rune specified in the format \Uxxxxxxxx to the actual rune:

    func unquoteCodePoint(s string) (rune, error) {
        // 16 specifies hex encoding
        // 32 is size in bits of the rune type
        r, err := strconv.ParseInt(strings.TrimPrefix(s, "\\U"), 16, 32)
        return rune(r), err
    }
    

    A variation is to convert to a string instead of a rune:

    func unquoteCodePoint(s string) (string, error) {
        r, err := strconv.ParseInt(strings.TrimPrefix(s, "\\U"), 16, 32)
        return string(r), err
    }
    

    Use the string version like this:

    s, err := unquoteCodePoint("\U0001f47f")
    if err != nil {
    // handle error
    }
    fmt.Printf("%s
    ", s) // prints
    点赞 评论
  • duanoucuo7045
    duanoucuo7045 2019-04-16 04:42

    You can do this? https://play.golang.org/p/4mFQfyqeAXN

    package main
    
    import (
        "fmt"
        "html"
        "strconv"
        "strings"
    )
    
    func main() {
        xx := "\\U0001f47f"
    
        // Hex String
        h := strings.ReplaceAll(xx, "\\U", "0x")
    
        // Hex to Int
        i, _ := strconv.ParseInt(h, 0, 64)
    
        // Unescape the string (HTML Entity -> String).
        str := html.UnescapeString(string(i))
    
        // Display the emoji.
        fmt.Println(str)
    }
    
    点赞 评论

相关推荐