2

似乎 golang 的符文不支持所有 unicode 字符

package main

import "fmt"

func main() {
  standardSuits := []rune{'♠️', '♣️', '♥️', '♦️'}
  fmt.Println(standardSuits)
}

生成以下错误:

./main.go:6: missing '
./main.go:6: invalid identifier character U+FE0F '️'
./main.go:6: syntax error: unexpected ️, expecting comma or }
./main.go:6: missing '
./main.go:6: invalid identifier character U+FE0F '️'
./main.go:6: missing '
./main.go:6: invalid identifier character U+FE0F '️'
./main.go:6: missing '
./main.go:6: invalid identifier character U+FE0F '️'
./main.go:6: missing '
./main.go:6: too many errors

有没有办法解决这个问题,还是我应该忍受这个限制并使用其他东西?

4

2 回答 2

5

在我看来,这就像一个解析问题。您可以使用 unicode 点来生成符文,它应该给出与使用字符相同的结果。

package main

import "fmt"

func main() {
  standardSuits := []rune{'\u2660', '\u2663', '\u2665', '\u2666', '⌘'}
  fmt.Println(standardSuits)
}

生成

[9824 9827 9829 9830 8984]

游乐场链接: https: //play.golang.org/p/jTLsbs7DM1

我添加了额外的第 5 个符文来检查代码点或字符的结果是否相同。看起来确实如此。

编辑:

不确定您的字符有什么问题(没有在十六进制编辑器中查看它们,周围没有),但它们有些奇怪。

我还通过复制粘贴来自维基百科的字符来运行它:

package main

import "fmt"

func main() {
  standardSuits := []rune{'♠', '♣', '♥', '♦'}
  fmt.Println(standardSuits)
}

https://play.golang.org/p/CKR0u2_IIB

于 2016-10-14T09:35:01.557 回答
2

您在源代码中使用的 unicode 字符串包含多个“字符”,但字符常量 '...' 不允许包含长度大于 1 的字符串。更详细地说:

如果我复制并粘贴您的源代码并打印一个 hexdump,我可以在您的源代码中看到确切的字节:

>>> hexdump -C x.go
00000000  70 61 63 6b 61 67 65 20  6d 61 69 6e 0a 0a 69 6d  |package main..im|
00000010  70 6f 72 74 20 22 66 6d  74 22 0a 0a 66 75 6e 63  |port "fmt"..func|
00000020  20 6d 61 69 6e 28 29 20  7b 0a 20 20 73 74 61 6e  | main() {.  stan|
00000030  64 61 72 64 53 75 69 74  73 20 3a 3d 20 5b 5d 72  |dardSuits := []r|
00000040  75 6e 65 7b 27 e2 99 a0  ef b8 8f 27 2c 20 27 e2  |une{'......', '.|
00000050  99 a3 ef b8 8f 27 2c 20  27 e2 99 a5 ef b8 8f 27  |.....', '......'|
00000060  2c 20 27 e2 99 a6 ef b8  8f 27 7d 0a 20 20 66 6d  |, '......'}.  fm|
00000070  74 2e 50 72 69 6e 74 6c  6e 28 73 74 61 6e 64 61  |t.Println(standa|
00000080  72 64 53 75 69 74 73 29  0a 7d 0a                 |rdSuits).}.|

例如,这表明您'♠️'是使用十六进制字节编码的e2 99 a0 ef b8 8f。在 utf-8 编码中,这对应于两个(!)字符\u2660 \uFE0F。这通过查看代码并不明显,因为\uFE0F没有可打印的字符,但 Go 抱怨,因为字符常量中有多个字符。使用'♠'or'\u2660'代替按预期工作。

于 2016-10-14T17:55:05.617 回答