Строки JavaScript кодируются UCS-2, но могут представлять кодовые точки Unicode вне базовой многоязычной панели (U+0000
- U+D7FF
и U+E000
- U+FFFF
) с использованием двух 16-битных чисел (UTF-16 * 1005).* суррогатная пара ), первая из которых должна находиться в диапазоне U+D800
- U+DFFF
.
Исходя из этого, легко определить, содержит ли строка какие-либо символы, лежащие за пределами BasicМногоязычная плоскость (о чем я думаю, вы спрашиваете: вы хотите иметь возможность определить, содержит ли строка какие-либо символы, лежащие за пределами диапазона кодовых точек, которые 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