UTF-16 substr

Javascript does not correctly implement UTF-16 surrogate pairs. This function does.

by doug65536

JavaScript

function utf16Substr(data, start, len) {
    var chars = [], dataLength = 0;
    for (var i = 0; i < data.length; ++i, ++dataLength) {
        var code = data.charCodeAt(i);
        if (code >= 0xD800 && code < 0xDC00) {
            // Surrogate pair
            chars.push(data[i] + data[i+1]);
            ++i;
        } else {
            // Normal
            chars.push(data[i]);
        }
    }
    
    if (len === undefined) {
        len = dataLength - start;
    }
    var end = start + len, result = '';
    for (var i = start; i < end; ++i)
        result += chars[i];
    return result;
}

alert(utf16Substr("😭😭a😭😭a", 2));