【问题标题】:Go rune literal for high positioned emojis高位表情符号的符文文字
【发布时间】:2021-06-01 00:15:06
【问题描述】:

我们如何使用具有超出我想象的符文文字的表情符号 码位 U+265F?

a1 := '\u2665'

  • 这行得通

a2 := '\u1F3A8'

  • 这会给出错误无效字符文字,多于一个字符。

有没有办法将较高位置的表情符号表示为符文文字?

https://unicode.org/emoji/charts/full-emoji-list.html

【问题讨论】:

    标签: go unicode emoji rune


    【解决方案1】:

    您可以使用\U 序列后跟8 个十六进制数字,这是Unicode 代码点的十六进制表示。这在Spec: Rune literals:中有详细说明

    有四种方法可以将整数值表示为数字常量:\x 后跟正好两个十六进制数字; \u 后跟正好四个十六进制数字; \U 后跟恰好八个十六进制数字,以及一个普通的反斜杠 \ 后跟三个八进制数字。在每种情况下,文字的值都是由相应基数中的数字表示的值。

    例如:

    a1 := '\u2665'
    fmt.Printf("%c\n", a1)
    
    a2 := '\U0001F3A8'
    fmt.Printf("%c\n", a2)
    

    哪些输出(在Go Playground 上试试):

    ♥
    ?
    

    注意(回复@torek):

    我相信 Go 的作者选择精确地要求 4 和 8 个十六进制数字,因为这允许在解释的字符串文字中使用 完全相同的形式,完全相同的符文文字。例如。如果你想要一个包含 2 个符文的字符串,一个有代码点 0x0001F3A8,另一个符文是 4,它可能看起来像这样:

    s := "\U0001F3A84"
    

    如果规范不需要精确的 8 个十六进制数字,那么最后一个 '4' 是代码点的一部分还是字符串的单个符文将是不明确的,因此您必须将 string 打破为像"\U1F3A8" + "4" 这样的串联。

    Spec: String literals:

    解释的字符串文字是双引号之间的字符序列,如"bar"。在引号内,可以出现除换行符和非转义双引号外的任何字符。引号之间的文本形成文字的值,反斜杠转义解释为它们在rune literals 中(除了\' 是非法的,\" 是合法的),具有相同的限制。三位八进制 (\nnn) 和两位十六进制 (\xnn) 转义表示结果字符串的各个字节;所有其他转义表示单个字符的(可能是多字节)UTF-8 编码。因此,在字符串文字内\377\xFF 表示值0xFF=255 的单个字节,而ÿ\u00FF\U000000FF\xc3\xbf 表示UTF-8 的两个字节0xc3 0xbf字符 U+00FF 的编码。

    【讨论】:

    • 我认为您的意思是 8 个十六进制 字符 - 不是 8 个十六进制 字节
    • @colm.anseo 对。
    • 我阅读了文档的那部分,但我没有意识到您需要在 \U 之后放置零。
    • 只是好奇:你(或任何读过这篇文章的 SO 上的人)知道为什么 Go 的作者选择这个完全 4/完全 8 语法,而不是(我认为更常见的)\u-后跟十六进制数字语法,在这里?显然,如果你想要 U+0123 后跟纯 ASCII 4,这需要在源代码中写入“\u123”+“4”,这是一个小麻烦,但是......它非常小。 :-) 无论哪种方式都没什么大不了的,而且规则很明确,但似乎有所不同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 2017-08-23
    • 2018-05-02
    • 2018-12-15
    • 2019-02-03
    相关资源
    最近更新 更多