致命错误:高代理代理点和低代理代码点不是有效的Unicode标量值

时间:2015-08-22 16:34:14

标签: string swift unicode utf-16 utf

有时,使用UnicodeScalar之类的值初始化57292会产生以下错误:

fatal error: high- and low-surrogate code points are not valid Unicode scalar values

这是什么错误,为什么会发生这种错误?如何在将来阻止它?

1 个答案:

答案 0 :(得分:7)

背景:UTF-16表示一系列Unicode字符(“代码点”)作为16位“代码单元”的序列。对于标量值适合16位的字符(即从U + 0000到U + FFFF的字符),代码单元具有与字符相同的值;但是对于该范围之外的字符(从U + 10000到U + 10FFFF),UTF-16必须使用两个代码单元。为了使这项工作,Unicode保留一系列代码点(U + D800到U + DFFF)作为“代理”,不能用作字符;然后,UTF-16可以将这些代理中的两个一起用于表示16位范围之外的代码点。 (“高”和“低”分别代表这些对中的第一第二代码单元的代理。每个代理都是高代理或者代理低代理,但不是两者兼而有;对旧字符集的体验表明,始终能够分辨出一个角色的结束和下一个角色的开始是非常有用的。)

所以你看到的问题是你正在尝试使用值(U + DFCC)创建UnicodeScalar,根据Unicode标准,该值保留给而不是是一个Unicode标量。 U + DFCC被定义为不存在,并且只是存在的一半标量的“代理”。

要防止出现此问题,您需要坚持使用存在的标量 - U + 0000至U + D7FF和U + E000至U + 10FFFF。