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

Vat*_*not 5 string unicode utf-16 utf swift

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

fatal error: high- and low-surrogate code points are not valid Unicode scalar values
Run Code Online (Sandbox Code Playgroud)

这个错误是什么,它为什么会发生,以后如何防止它?

rua*_*akh 7

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

因此,您所看到的问题是您正在尝试UnicodeScalar使用值(U + DFCC)创建一个值,根据Unicode标准,该值保留为不是 Unicode标量.U + DFCC被定义为不存在,并且仅仅是存在的标量的一半的"代理".

为了防止这个问题,你需要坚持存在的标量 - U + 0000到U + D7FF和U + E000到U + 10FFFF.