无效的Unicode代码点0xd83f

Dog*_*Dog 3 unicode go

我正在尝试将Java移植到Go。Java代码的字符变量值为'\ud83f'。当我尝试在Go中使用此值时,它不会编译:

package main
func main() {
    c := '\ud83f'
    println(c)
}
Run Code Online (Sandbox Code Playgroud)

$ go run a.go
# command-line-arguments
./a.go:3: invalid Unicode code point in escape sequence: 0xd83f
Run Code Online (Sandbox Code Playgroud)

为什么?我还尝试在Python中用该值创建一个字符串,它也起作用。由于某种原因,它在Go中不起作用。

Har*_*son 5

您尝试使用的符文文字无效,因为它表示替代代码点。规范说,符文文字不能表示代理代码点(“以及其他”(哪个?)):

符文文字

[...]

转义\ u和\ U表示Unicode代码点,因此其中的某些值是非法的,尤其是那些大于0x10FFFF的值和代理半值。

在下面的示例中,您还可以看到其他被视为非法的案件:

'\ U00110000'//非法:无效的Unicode代码点

这似乎暗示着无效的代码点(例如高于10ffff的代码点)在符文文字中也是非法的。

请注意,由于rune仅仅是的别名int32,您可以简单地执行以下操作:

var r rune = 0xd8f3
Run Code Online (Sandbox Code Playgroud)

代替

var r rune = '\ud8f3'
Run Code Online (Sandbox Code Playgroud)

如果您想获得大于10FFFF的数字,则可以

var r rune = 0x11ffff
Run Code Online (Sandbox Code Playgroud)

代替

var r rune = '\U0011ffff'
Run Code Online (Sandbox Code Playgroud)