无效的Unicode代码点0xd83f

我正在尝试将某些Java移植到Go。 Java代码具有一个字符变量,其值为'\ ud83f'</ code>。 当我尝试在Go中使用此值时,它不会编译:</ p>

 包main 
func main(){
c:='\ ud83f'
println( c)
}
</ code> </ pre>

</ p>

  $ $运行a.go 
#命令行参数
./a.go:3:转义序列中无效的Unicode代码点:0xd83f
</ code> </ pre>

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

展开原文

原文

I'm trying to port some Java to Go. The Java code has a character variable with the value '\ud83f'. When I try to use this value in Go, it doesn't compile:

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

Why? I also tried making a string with that value in Python and it worked too. It's just not working in Go for some reason.

2个回答



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


Rune文字 </ p>

[...] </ p>

\ u和\ U代表Unicode代码点,因此其中
某些值是非法的,尤其是那些大于0x10FFFF和
替代的值。</ p>
</ blockquote>

在这些示例中,您可以看到另一种被视为非法的情况:</ p>


'\ U00110000'//非法:无效的Unicode代码点</ p>
</ blockquote >

这似乎暗示着无效的代码点(例如10ffff以上的代码点)在符文文字中也是非法的。</ p>

请注意,由于 rune </ code>只是 int32 </ code>的别名,您可以轻松做到:</ p>

  var r rune = 0xd8f3 
</ code> </ pre>

而不是</ p>

  var r rune ='\ ud8f3'
</ code> </ pre>

您想获得大于10FFFF的数字 您可以</ p>

  var r rune = 0x11ffff 
</ code> </ pre>

代替</ p>

< pre> var r rune ='\ U0011ffff'
</ code> </ pre>
</ div>

展开原文

原文

That rune literal you tried to use is invalid because it denotes a surrogate code point. The spec says rune literals cannot denote a surrogate code point ("as well as others" (which?)):

Rune Literals

[...]

The escapes \u and \U represent Unicode code points so within them some values are illegal, in particular those above 0x10FFFF and surrogate halves.

Further below in the examples, you can see another case which is deemed illegal:

'\U00110000' // illegal: invalid Unicode code point

Which seems to imply that invalid code points (such as those above 10ffff) are also illegal in rune literals.

Note that since rune is merely an alias for int32, you can simply do:

var r rune = 0xd8f3

instead of

var r rune = '\ud8f3'

And if you wanted to get a number above 10FFFF you could do

var r rune = 0x11ffff

instead of

var r rune = '\U0011ffff'



已经提到, \ ud83f </ code>是替代一半的一部分,用于UTF-16编码。\ n这不是有效的代码点,因此 转到规范 </ strong> 状态:</ p>


转义符\ u和\ U表示Unicode代码点,因此其中
某些值是非法的,尤其是0x10FFFF和
以上的值 替代一半</ em>。</ p>
</ blockquote>

如果您想要具有此无效代码点的符文,则可以执行以下操作:</ p>

< pre> c:= rune(0xd83f)
</ code> </ pre>

但是,处理此值的正确方法是先对两个代理半部分进行解码,然后使用 得到的有效</ em>代码点。</ p>
</ div>

展开原文

原文

Already being mentioned, \ud83f is part of a surrogate half, used in UTF-16 encoding. This is not considered a valid code point, and the Go specification explicitly states:

The escapes \u and \U represent Unicode code points so within them some values are illegal, in particular those above 0x10FFFF and surrogate halves.

If you want a rune with this invalid code point, you can do the following:

c := rune(0xd83f)

But, the correct way to handling such a value is to first decode the two surrogate halves, then using the resulting valid code point.

doubi1928
doubi1928 我认为这适用于所有UTF。 如果您只有0xD9、0x00,那么它也是无效的UTF-16序列(规范:“涉及具有非法值或未配对替代的替代对的序列”),编码器/解码器应考虑到这一点。
接近 6 年之前 回复
doumu1936
doumu1936 真? 我从不知道,也没有注意到它正在编码U + FFFD。 是否只有UTF-8具有该限制? 但是替代代码点的目的不是捕获失败的UTF-16解码吗? 一些UTF-16可能只是0xD9,0x00(如果为小端则为反向),然后它将解码为U + D900,但是当您对它进行UTF-8编码时,信息就会丢失(Python中除外)。 我测试了Java,它也转换为U + FFFD。
接近 6 年之前 回复
doulu1325
doulu1325 根据UTF-8规范,它是无效的UTF-8。 您得到的输出是替换字符的UTF-8编码,而不是0xd83f。 Go可以正确处理无效的代码点。 我不确定Python在做什么。
接近 6 年之前 回复
donglu1472
donglu1472 Python >>> u“ \ ud83f” .encode(“ utf8”)'输出'\ xed \ xa0 \ xbf'。 甚至Go都认为这是有效的:fmt.Println([] byte(string([] rune {0xd83f}))))输出[239 191 189]。 如您所见,限制只是语法上的。 不知道你的第二点是什么。
接近 6 年之前 回复
duanreng3439
duanreng3439 我从未说过这不是代码点。 它是。 这只是无效的。 没有UTF可以对其进行编码。 由于int和int32是两种不同的类型,因此,如果要使用rune / int32,仍然需要显式指定rune(或int32)。
接近 6 年之前 回复
duanhuo7441
duanhuo7441 代理代码点是有效的Unicode代码点。 我以为您是在说它们总体上是无效的(与Go中的无效相对)。 第二点:我只是指出,在用户使用符文(或int类型...)的实际情况下,您不需要转换。 这种转换意味着错误地编写代码的人认为,符文类型的值是Unicode代码点的抽象,而不仅仅是int32。
接近 6 年之前 回复
dongshi6969
dongshi6969 错误? Go如何认为它有效? Spec可能改用“非法”一词,而我使用“无效”作为同义词。 并且,当然,您需要明确指定符文,否则它将对默认类型使用默认类型(在这种情况下为int)。 您的代码和我的代码是等效的。
接近 6 年之前 回复
dongyongkui6329
dongyongkui6329 “这不被视为有效的代码点”错误。 同样,即使类型是符文而不是默认类型,也不需要将转换分配给c。 即,这有效:包main; func main(){var r rune = 0xd83f; R = R}
接近 6 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐