什么是Java中的“代理对”?

问题

我正在阅读StringBuffer的文档,特别是reverse()方法。那份文件提到了一些有关对象的内容。在这种情况下,什么是代理对?什么是低风险的?


#1 热门回答(96 赞)

术语"代理对"是指在UTF-16编码方案中用高代码点编码Unicode字符的方法。

在Unicode字符编码中,字符映射到0x0和0x10FFFF之间的值。

在内部,Java使用UTF-16编码方案来存储Unicode文本的字符串。在UTF-16中,使用16位(双字节)代码单元。由于16位只能包含从0x0到0xFFFF的字符范围,因此使用一些额外的复杂度来存储高于此范围(0x10000到0x10FFFF)的值。这是使用称为代理的代码单元对完成的。

代理代码单元在两个范围内称为"高代理"和"低代理",这取决于它们是否允许在双代码单元序列的开头或结尾。


#2 热门回答(22 赞)

该文档所说的是,无效的UTF-16字符串在调用reverse方法后可能变为有效,因为它们可能是有效字符串的反转。代理对(已讨论here)是UTF-16中的一对16位值,它们编码单个Unicode代码点;低和高代理是该编码的两半。


#3 热门回答(19 赞)

早期Java版本使用16位char数据类型表示Unicode字符。这种设计在当时是有意义的,因为所有Unicode字符的值都小于65,535(0xFFFF),并且可以用16位表示。但是,稍后,Unicode将最大值增加到1,114,111(0x10FFFF)。由于16位值太小而无法表示Unicode版本3.1中的所有Unicode字符,因此UTF-32编码方案采用32位值(称为代码点)。但是为了有效使用内存,16位值优于32位值,因此Unicode引入了一种新设计,允许继续使用16位值。采用UTF-16编码方案的这种设计将1624个值分配给16位高代理(在U D800到U DBFF范围内),另外1,024个值分配给16位低代理(在U DC00到U DFFF范围内) )。它使用高代理,后跟低代理 - 代理对 - 代表(1,024和1,024的乘积)1,048,576(0x100000)值介于65,536(0x10000)和1,114,111(0x10FFFF)之间。