2011-02-02 127 views
17

是否有可能在Javascript中检测字符串是否包含多字节字符?如果是这样,是否可以分辨哪些?如何判断一个字符串是否包含Javascript中的多字节字符?

我遇到的问题是这样的(道歉,如果Unicode的字符不为你显示右)

s = ""; 

alert(s.length); // '2' 
alert(s.charAt(0)); // '��' 
alert(s.charAt(1)); // '��' 

编辑了一下清晰这里的(我希望)据我现在的理解,Javascript中的所有字符串都表示为一系列UTF-16代码点,这意味着常规字符实际占用2个字节(16位),所以我在标题中使用了“多字节”有点偏离。某些字符不属于基本多语言平面(BMP),例如上述示例中的字符串,因此它们占用两个代码点(32位)。这是我问的问题。我也没有编辑原始标题,因为对一个对这些东西不太了解的人(因此会搜索所以有关它的信息),那么“多字节”就会有意义。

+0

正则表达式? – Marco 2011-02-02 17:06:17

+0

要测试什么? – nickf 2011-02-02 17:27:36

回答

23

JavaScript的字符串是UCS-2编码,但可以表示基本多窗格外Unicode代码点(U+0000 - U+D7FFU+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 
0

这是我的实现,以显示更大的表情符号,如果消息不包含文本

标记

<div> 
    <input id="message" placeholder="Nice support for one or multiple emojis"> 
    <button id="post-message">Send</button> 
    <ul id="messages"></ul> 
</div> 

脚本

function jumbotron(str) { 
    return /^[\uD800-\uDFFF]+$/.test(str); 
} 

document.getElementById('post-message').onclick = function() { 
    list_element = document.createElement('li'); 
    message = document.getElementById('message').value; 

    list_element_span = document.createElement('span'); 
    list_element_span.innerHTML = message; 
    list_element.appendChild(list_element_span); 

    if (jumbotron(message)) { 
     list_element_span.style.fontSize = '2em'; 
     list_element_span.style.lineHeight = 'normal'; 
    } 

    document.getElementById('messages').appendChild(list_element) 
} 
相关问题