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

Print emoji from Unicode literal loaded from file

我正在尝试使用 Go 打印从 JSON 文件加载的 Unicode 表情符号字符。 当我加载和解组我的文件时,传递给 fmt.Println 的结构字段仅打印转义字符串序列。

例如,一个字符串作为 {…"Unicode":"\U0001f47f"} 存储在文件中,打印它会产生 \U0001f417 而不是表情符号字符。 调用 fmt.Printf("%q", str) 会产生 \U0001f417。我找不到解决方案,我有点难过。我试图删除转义序列并将其连接到模板字符串中,但没有任何影响。我也尝试过使用字符串缓冲区,但它也没有用。

你能做到吗? 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)
}

使用以下函数将格式 \Uxxxxxxxx 中指定的符文转换为实际符文:

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
}

一种变体是转换为字符串而不是符文:

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

像这样使用字符串版本:

s, err := unquoteCodePoint("\U0001f47f")
if err != nil {
    // handle error
}
fmt.Printf("%s\n", s) // prints