【问题标题】:Print emoji from Unicode literal loaded from file从文件加载的 Unicode 文字打印表情符号
【发布时间】:2019-09-06 01:59:28
【问题描述】:

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

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

【问题讨论】:

  • "\\U0001f417" 之类的东西不是代码点,而是您需要解析才能找到代码点的字符串。不幸的是,stdlib strconv.Unquote 中的默认函数不能直接应用,因为它 a) 需要额外的引号和 b) 小写 u。所以:去掉任何不是数字和前导零的东西,解析十六进制数字并使用 fmt.Printf 的 %c 动词格式化该代码点。
  • 啊,这是一个很棒的专业提示。感谢您的贡献!

标签: json string go unicode emoji


【解决方案1】:

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

【讨论】:

  • 这是一个简洁的替代解决方案!感谢您添加它。
【解决方案2】:

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

【讨论】:

  • 这真是太棒了!感谢您也添加了 cmets;我总是被字符串编码绊倒。
猜你喜欢
  • 1970-01-01
  • 2020-06-21
  • 2020-09-07
  • 2015-07-07
  • 1970-01-01
  • 2016-11-06
  • 2015-02-22
  • 2014-08-23
  • 2019-07-31
相关资源
最近更新 更多