2011-02-02 77 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) 
} 
相關問題