JavaScript 字符串是 UCS-2 编码的,但可以使用两个 16 位数字(UTF-16代理对U+0000
)表示基本多语言窗格( -U+D7FF
和U+E000
- )之外的 Unicode 代码点,其中第一个数字必须在-范围内。U+FFFF
U+D800
U+DFFF
基于此,很容易检测字符串是否包含位于基本多语言平面之外的任何字符(这就是我认为您要问的:您希望能够识别字符串是否包含位于范围之外的任何字符JavaScript 表示为单个字符的代码点):
function containsSurrogatePair(str) {
return /[\uD800-\uDFFF]/.test(str);
}
alert( containsSurrogatePair("foo") ); // false
alert( containsSurrogatePair("f") ); // true
精确计算字符串中包含哪些代码点有点困难,并且需要 UTF-16 解码器。以下将字符串转换为 Unicode 代码点数组:
var getStringCodePoints = (function() {
function surrogatePairToCodePoint(charCode1, charCode2) {
return ((charCode1 & 0x3FF) << 10) + (charCode2 & 0x3FF) + 0x10000;
}
// Read string in character by character and create an array of code points
return function(str) {
var codePoints = [], i = 0, charCode;
while (i < str.length) {
charCode = str.charCodeAt(i);
if ((charCode & 0xF800) == 0xD800) {
codePoints.push(surrogatePairToCodePoint(charCode, str.charCodeAt(++i)));
} else {
codePoints.push(charCode);
}
++i;
}
return codePoints;
}
})();
alert( getStringCodePoints("f").join(",") ); // 102,119558