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
有没有办法绕过这个,或者我应该忍受这个限制并使用别的东西?
答案 0 :(得分: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/CKR0u2_IIB
我添加了额外的第5个符文来检查代码点或字符的结果是否相同。看起来确实如此。
不确定你的字符有什么问题(没有在十六进制编辑器中查看它们,周围没有它们),但有些事情很奇怪。
我还通过复制粘贴来自维基百科的字符来运行:
package main
import "fmt"
func main() {
standardSuits := []rune{'♠', '♣', '♥', '♦'}
fmt.Println(standardSuits)
}
答案 1 :(得分: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抱怨,因为字符常量中有多个字符。使用'♠'
或'\u2660'
可以按预期工作。