Я работаю над приложением для твиттера и только что наткнулся на мир 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, но мое тестирование заставляет меня поверить, что это может быть формат данных, но функции еще не знают этого. Я пропустил что-то простое?
РЕДАКТИРОВАТЬ: Чтобы проиллюстрировать проблему:
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 символов.
[????-????]
по шаблону и посмотрите, что получится. Он просто сломан. Если бы Javascript действительно использовал UTF-16, я мог бы написатьdocument.write(String.fromCharCode(0x1D49C))
, и мне не пришлось бы писать и не было бы разрешено писатьdocument.write(String.fromCharCode(0xD835,0xDC9C))
вместо него. Это чепуха сломанная UCS-2. - person tchrist   schedule 31.07.2011