我正在开发一款Twitter应用程序,刚刚接触到了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 荒唐行为。 - tchrist