例如,如果我使用像这样的长任意数字来显示字符String.fromCharCode(123456454545789)
,则会输出此字符兽
。
但是当我尝试检索与此'兽'.charCodeAt(0);
相同的字符的代码时,它会输出此代码20861
。
我知道charCodeAt
将始终返回小于65,536的值,因为具有较高代码点的字符由一对(较低值)“代理”伪字符表示。
但是当我尝试通过像这个'兽'.charCodeAt(1);
增加索引来获取可能的第二个char的代码时,没有其他代码可以返回。
如果我输入相同的代码,例如String.fromCharCode(20861)
,它也会显示相同的字符兽
。
我不确定为什么会这样,也许它甚至不会发生。但无论哪种方式,我的问题是 - 我怎么能得到那么长的任意数字呢?如果有多个代码可用于表示该字符,例如123456454545789
或20861
charCodeAt
的哪些替代/补充将告诉我前一个数字而不是后者,这些更高的代码点字符中的任何一个?
答案 0 :(得分:1)
String.fromCharCode()参数被屏蔽为16位无符号整数,这符合ECMAScript标准。因此,当执行String.fromCharCode(123456454545789)时,参数首先减少到20861.对于20861 + n * 65536形式的任何参数都会发生这种情况,因此无法获取原始大数(或者,正式地说,你可以获得无限数量的这样的数字。)
这与代理代码点无关。字符串'兽'仅由一个BMP字符组成。如果您有非BMP字符(代码编号> 0xFFFF),说''(U + 20000),那么代理是相关的,并且对于这样的字符串(由内部表示的单个Unicode字符组成)在JavaScript中作为两个代理代码点),fromCharCode(0)和fromCharCode(1)被定义并产生代理代码点值,例如55360和56320.(现代实现通常可以处理包含非BMP字符的文字,比如'',虽然标准中不要求这样做。)