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

3

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

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


1
类似于“\U0001f417”这样的东西不是一个代码点,而是一个你需要解析以找到代码点的字符串。不幸的是,stdlib strconv.Unquote 的默认函数不能直接应用,因为它a)需要额外的引号和b)小写u。所以:去掉任何非数字和前导零,解析十六进制数字,并使用fmt.Printf的%c动词格式化该代码点。 - Volker
啊,这是一个很棒的专业技巧。感谢您的贡献! - lindsay
2个回答

10
使用以下函数将以 \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  

这真的很棒!感谢您添加注释;我总是被字符串编码绊倒。 - lindsay

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

这是一个很不错的替代方案!感谢您加入它。 - lindsay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接