有时,使用UnicodeScalar
之类的值初始化57292
会产生以下错误:
fatal error: high- and low-surrogate code points are not valid Unicode scalar values
这是什么错误,为什么会发生这种错误?如何在将来阻止它?
答案 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。