JavaScript文字列はUCS-2でエンコードされますが、 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