我试图将一些Java移植到Go。 Java代码具有值'\ud83f'
的字符变量。当我尝试在Go中使用此值时,它不会编译:
package main
func main() {
c := '\ud83f'
println(c)
}
$ go run a.go
# command-line-arguments
./a.go:3: invalid Unicode code point in escape sequence: 0xd83f
为什么呢?我也尝试在Python中使用该值创建一个字符串,它也有效。由于某种原因,它只是不在Go工作。
答案 0 :(得分:4)
您尝试使用的符文文字无效,因为它表示代理代码点。规范说符文文字不能表示代理代码点(“和其他人一样”(哪个?)):
[...]
escapes \ u和\ U代表Unicode代码点 有些值是非法的,特别是那些高于0x10FFFF和 代理一半。
在下面的示例中,您可以看到另一个被视为非法的案例:
'\ U00110000'//非法:Unicode代码点无效
这似乎意味着无效的代码点(例如10ffff以上的代码点)在符文文字中也是非法的。
请注意,由于rune
仅是int32
的别名,因此您可以执行以下操作:
var r rune = 0xd8f3
而不是
var r rune = '\ud8f3'
如果你想获得一个高于10FFFF的数字,你可以做到
var r rune = 0x11ffff
而不是
var r rune = '\U0011ffff'
答案 1 :(得分:3)
已经提到过,\ud83f
是代理半部分的一部分,用于UTF-16编码。
这不被视为有效的代码点, Go specification 明确指出:
escapes \ u和\ U代表Unicode代码点 某些值是非法的,特别是那些高于0x10FFFF和 代理一半。
如果您想要一个具有此无效代码点的符文,您可以执行以下操作:
c := rune(0xd83f)
但是,处理这样一个值的正确方法是首先解码两个代理项,然后使用生成的有效代码点。