JavaScript的字符串是UCS-2編碼,但可以表示基本多窗格外Unicode代碼點(U+0000
- U+D7FF
和U+E000
- U+FFFF
),使用2個16位數字(一個UTF-16 代理對),第一它必須在範圍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
正則表達式? – Marco 2011-02-02 17:06:17
要測試什麼? – nickf 2011-02-02 17:27:36