Я работаю над твиттер-приложением и просто наткнулся на мир utf-8 (16). Похоже, что большинство функций строки javascript так же слепы к суррогатным парам, как и я. Мне нужно перекодировать некоторые вещи, чтобы они были осведомлены о широком знании.
У меня есть эта функция для синтаксического анализа строк в массивах при сохранении суррогатных пар. Затем я перекодирую несколько функций для обработки массивов, а не строк.
function sortSurrogates(str){
var cp = []; // array to hold code points
while(str.length){ // loop till we've done the whole string
if(/[\uD800-\uDFFF]/.test(str.substr(0,1))){ // test the first character
// High surrogate found low surrogate follows
cp.push(str.substr(0,2)); // push the two onto array
str = str.substr(2); // clip the two off the string
}else{ // else BMP code point
cp.push(str.substr(0,1)); // push one onto array
str = str.substr(1); // clip one from string
}
} // loop
return cp; // return the array
}
Мой вопрос: есть ли что-то более простое, что мне не хватает? Я вижу, что многие люди повторяют, что javascript имеет дело с utf-16 изначально, но мое тестирование заставляет меня поверить, что это может быть формат данных, но функции еще этого не знают. Я пропустил что-то простое?
EDIT: Чтобы помочь проиллюстрировать проблему:
var a = "0123456789"; // U+0030 - U+0039 2 bytes each
var b = "𝟘𝟙𝟚𝟛𝟜𝟝𝟞𝟟𝟠𝟡"; // U+1D7D8 - U+1D7E1 4 bytes each
alert(a.length); // javascript shows 10
alert(b.length); // javascript shows 20
Twitter видит и считает, что оба из них имеют длину 10 символов.