无效的Unicode代码点0xd83f

时间:2014-08-28 20:18:56

标签: unicode go

我试图将一些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工作。

2 个答案:

答案 0 :(得分:4)

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

  

Rune Literals

     

[...]

     

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)

但是,处理这样一个值的正确方法是首先解码两个代理项,然后使用生成的有效代码点。