2012-04-11 31 views
1

例如,如果我使用這樣一個長的任意數字來顯示一個字符String.fromCharCode(123456454545789)它會輸出這個字符在js中獲取高碼位字符的長數字代碼?

但是,當我嘗試檢索像這樣'獸'.charCodeAt(0);相同字符的代碼時,它輸出此代碼20861

據我所知,charCodeAt將始終返回小於65,536的值,因爲具有較高代碼點的字符由一對(較低值)的「替代」僞字符表示。

但是,當我嘗試通過增加索引'獸'.charCodeAt(1);來獲得可能的第二個字符的代碼時,沒有其他代碼要返回。

如果我把相同的代碼放入,就像這個String.fromCharCode(20861)它也會顯示相同的字符

我不知道爲什麼會發生這種情況,也許它甚至不會發生。但無論哪種方式,我的問題是 - 我怎麼能得到這個長期的任意數字?如果有多個可用於表示該字符的代碼,如12345645454578920861對於任何這些較高代碼點字符,charCodeAt的哪些替代/補充將告訴我前一個數字而不是後一個數字?

+2

不確定,但是您是否知道123456454545789%65536是20861? – 2012-04-11 10:26:45

回答

1

String.fromCharCode()參數被屏蔽爲一個16位無符號整數,並且這符合ECMAScript標準。因此,在執行String.fromCharCode(123456454545789)時,參數首先被縮減爲20861.對於形式爲20861 + n * 65536的任何參數,都會發生這種情況,因此無法將原始大數返回(或者說,你可以得到無數的這樣的數字)。

這與代理代理點無關。字符串'獸'只包含一個BMP字符。如果您有非BMP字符(代碼編號> 0xFFFF),請說''(U + 20000),然後代用品是相關的,並且對於這樣一個字符串(由一個單一的Unicode字符組成的內部代表作爲兩個代理代碼(來自CharCode(0)和來自CharCode(1)),併產生替代碼點值,例如55360和56320.(現代實現通常可以處理包含非BMP字符的文字,例如'',儘管這在標準中不需要。)