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!
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
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)
}