Removing modifiers in emojis

by Derek Leung

JavaScript

var UnicodeString;
function main(){
	// Modifiers
    var modifiersMin = 0x1F3FB, modifiersMax = 0x1F3FF;

	// Emoji with U+1F3FB "light skin tone" modifier
    var string = new UnicodeString("Hello from 🤷🏻‍♂️!");
    console.log("Emoji with U+1F3FB \"light skin tone\" modifier:", string.toString());
    console.log(string.codePoints.map(c => c.toString(16)));
    
    // Getting rid of the skin tone modifier
    string = new UnicodeString(string.codePoints.filter(c => c < modifiersMin || c > modifiersMax));
    console.log("Emoji without modifier:", string.toString());
    console.log(string.codePoints.map(c => c.toString(16)));
    
    alert(string.toString());
}

/* https://stackoverflow.com/a/6886748/283863 */
UnicodeString = (function() {
    function surrogatePairToCodePoint(charCode1, charCode2) {
        return ((charCode1 & 0x3FF) << 10) + (charCode2 & 0x3FF) + 0x10000;
    }

    function stringToCodePointArray(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;
    }

    function codePointArrayToString(codePoints) {
        var stringParts = [];
        for (var i = 0, len = codePoints.length, codePoint, offset, codePointCharCodes; i < len; ++i) {
            codePoint = codePoints[i];
            if (codePoint > 0xFFFF) {
                offset = codePoint - 0x10000;
                codePointCharCodes = [0xD800 + (offset >> 10), 0xDC00 + (offset & 0x3FF)];
            } else {
                codePointCharCodes = [codePoint];
            }
            stringParts.push(String.fromCharCode.apply(String, codePointCharCodes));
        }
        return stringParts.join("");
    }

    function UnicodeString(arg)...