nic*_*ckf 21 javascript string internationalization multibyte
是否有可能在Javascript中检测字符串是否包含多字节字符?如果是这样,是否可以分辨哪些?
我遇到的问题是这个(如果Unicode char不适合你,我会道歉)
s = "";
alert(s.length); // '2'
alert(s.charAt(0)); // '??'
alert(s.charAt(1)); // '??'
Run Code Online (Sandbox Code Playgroud)
在这里编辑一点清晰(我希望). 据我所知,Javascript中的所有字符串都表示为一系列UTF-16代码点,这意味着常规字符实际占用2个字节(16位),因此我在标题中使用"多字节"有点关闭.某些字符不属于基本多语言平面(BMP),例如上例中的字符串,因此它们占用两个代码点(32位).这是我问的问题.我也没有编辑原始标题,因为对于那些对这些东西不太了解的人(因此会搜索SO的信息),"multibyte"会有意义.
Tim*_*own 27
JavaScript字符串是UCS-2编码的,但可以使用两个16位数字(UTF-16 代理项对)表示基本多语言窗格(U+0000- U+D7FF和U+E000- U+FFFF)之外的Unicode代码点,第一个必须在范围内- .U+D800U+DFFF
基于此,很容易检测字符串是否包含任何位于基本多语言平面之外的字符(我认为您要问的是:您希望能够识别字符串是否包含超出范围的任何字符JavaScript表示为单个字符的代码点):
function containsSurrogatePair(str) {
return /[\uD800-\uDFFF]/.test(str);
}
alert( containsSurrogatePair("foo") ); // false
alert( containsSurrogatePair("f") ); // true
Run Code Online (Sandbox Code Playgroud)
精确计算字符串中包含哪些代码点要困难一点,并且需要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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8903 次 |
| 最近记录: |