ReactNative系列之四十六 JS 系统表情转码

附上uncode表情官方地址:https://unicode.org/emoji/charts/full-emoji-list.html#1f600

https://unicode.org/Public/emoji/13.0/emoji-sequences.txt

一个在JS中处理表情的库,提供的方法挺有用。但看了下还是和官方的少一些表情,不过库倒是经常更新

https://github.com/omnidan/node-emoji

 

/**
 * 将表情转字符
 * @param {}} str 表情字符
 */
export function utf16toEntities(str) {
    var patt = /[\ud800-\udbff][\udc00-\udfff]/g; // 检测utf16字符正则
    str = str.replace(patt, function(char) {
        var H, L, code;
        if (char.length === 2) {
            H = char.charCodeAt(0); // 取出高位
            L = char.charCodeAt(1); // 取出低位
            code = (H - 0xd800) * 0x400 + 0x10000 + L - 0xdc00; // 转换算法
            return '&#' + code + ';';
        } else {
            return char;
        }
    });
    return str;
}

/**
 * 将字符转表情
 * @param {*} str utf16态的表情编码
 */
export function uncodeUtf16(str) {
    var reg = /\&#.*?;/g;
    var result = str.replace(reg, function(char) {
        var H, L, code;
        if (char.length === 9) {
            code = parseInt(char.match(/[0-9]+/g), 10);
            H = Math.floor((code - 0x10000) / 0x400) + 0xd800;
            L = ((code - 0x10000) % 0x400) + 0xdc00;
            return unescape('%u' + H.toString(16) + '%u' + L.toString(16));
        } else {
            return char;
        }
    });
    return result;
}

/**
 * 是否为表情字符串
 * @param {} substring 表情字符
 */
export function isEmojiCharacter(substring) {
    for (var i = 0; i < substring.length; i++) {
        var hs = substring.charCodeAt(i);
        if (hs >= 0xd800 && hs <= 0xdbff) {
            if (substring.length > 1) {
                var ls = substring.charCodeAt(i + 1);
                var uc = (hs - 0xd800) * 0x400 + (ls - 0xdc00) + 0x10000;
                if (uc >= 0x1d000 && uc <= 0x1f77f) {
                    return true;
                }
            }
        } else if (substring.length > 1) {
            var ls = substring.charCodeAt(i + 1);
            if (ls === 0x20e3) {
                return true;
            }
        } else {
            if (hs >= 0x2100 && hs <= 0x27ff) {
                return true;
            } else if (hs >= 0x2b05 && hs <= 0x2b07) {
                return true;
            } else if (hs >= 0x2934 && hs <= 0x2935) {
                return true;
            } else if (hs >= 0x3297 && hs <= 0x3299) {
                return true;
            } else if (
                hs === 0xa9 ||
                hs === 0xae ||
                hs === 0x303d ||
                hs === 0x3030 ||
                hs === 0x2b55 ||
                hs === 0x2b1c ||
                hs === 0x2b1b ||
                hs === 0x2b50
            ) {
                return true;
            }
        }
    }
    return false;
}

export function stringToUtf8ByteArray(str) {
    var out = [],
        p = 0;
    for (var i = 0; i < str.length; i++) {
        var c = str.charCodeAt(i);
        if (c < 128) {
            out[p++] = c;
        } else if (c < 2048) {
            out[p++] = (c >> 6) | 192;
            out[p++] = (c & 63) | 128;
        } else if ((c & 0xfc00) == 0xd800 && i + 1 < str.length && (str.charCodeAt(i + 1) & 0xfc00) == 0xdc00) {
            c = 0x10000 + ((c & 0x03ff) << 10) + (str.charCodeAt(++i) & 0x03ff);
            out[p++] = (c >> 18) | 240;
            out[p++] = ((c >> 12) & 63) | 128;
            out[p++] = ((c >> 6) & 63) | 128;
            out[p++] = (c & 63) | 128;
        } else {
            out[p++] = (c >> 12) | 224;
            out[p++] = ((c >> 6) & 63) | 128;
            out[p++] = (c & 63) | 128;
        }
    }
    return out;
}

//bytes转换成字符串
export function utf8ByteArrayToString(bytes) {
    var out = [],
        pos = 0,
        c = 0;
    while (pos < bytes.length) {
        var c1 = bytes[pos++];
        if (c1 < 128) {
            out[c++] = String.fromCharCode(c1);
        } else if (c1 > 191 && c1 < 224) {
            var c2 = bytes[pos++];
            out[c++] = String.fromCharCode(((c1 & 31) << 6) | (c2 & 63));
        } else if (c1 > 239 && c1 < 365) {
            var c2 = bytes[pos++];
            var c3 = bytes[pos++];
            var c4 = bytes[pos++];
            var u = (((c1 & 7) << 18) | ((c2 & 63) << 12) | ((c3 & 63) << 6) | (c4 & 63)) - 0x10000;
            out[c++] = String.fromCharCode(0xd800 + (u >> 10));
            out[c++] = String.fromCharCode(0xdc00 + (u & 1023));
        } else {
            var c2 = bytes[pos++];
            var c3 = bytes[pos++];
            out[c++] = String.fromCharCode(((c1 & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
        }
    }
    return out.join('');
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
码CMS(内容管理系统)App一体化系统,是一种集成了云码技术、CMS内容管理功能和移动应用开发的综合解决方案。该系统能够提供以下几个方面的优势和功能。 首先,云码技术可以将各种格式的视频文件码为适应移动应用的格式,从而提供更好的用户体验。不同设备和平台对视频格式的要求各不相同,通过云码技术,可以将视频码为适应不同设备和平台的格式,确保视频在各种移动设备上流畅播放。 其次,CMS内容管理功能可以让用户方便地管理和发布视频内容。通过CMS系统,用户可以上传和管理视频文件,对视频进行分类、标签、描述等信息的编辑和管理。同时,CMS还支持多种形式的视频发布,包括视频列表、专题推荐、用户订阅等功能,使用户可以灵活地发布和推广视频内容。 再次,移动应用开发功能可以将CMS系统应用到移动端。通过开发移动应用,用户可以方便地在移动设备上访问和浏览CMS系统中的视频内容。同时,移动应用还可以提供更多的功能和交互体验,例如视频搜索、收藏、分享等功能,进一步提升用户体验。 综上所述,云码CMS App一体化系统结合了云码技术、CMS内容管理功能和移动应用开发的优势,为用户提供了一个综合的解决方案。这个系统可以方便地管理和发布视频内容,同时通过云码技术提供更好的视频播放体验,并通过移动应用让用户方便地在移动设备上访问和浏览视频内容。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值