转换内容为html实体

在开发业务过程中,遇到了对特殊字符的各种兼容,即需要支持各种特殊符号输入,又不引起注入问题,简单的方式就是转换为 utf8 编码,这些编码和html实体的作用一致,
转换过程中,又遇到了emoji表情是占用两个字节的,又加了对 emoji 字符的处理,
我这里就叫它html实体吧,参考了文末的文章,写出了如下方法:

/**
 * 字符串转字符实体
 * @param text 转换文本
 * @param radix 返回的字符实体进制,只能是10进制和16进制,默认是10进制
 * @returns
 */
var convertStringToHtmlEntity = function (text, radix) {
    if (radix == null || radix == undefined) {
        radix = 10;
    }
    //检测字符是否在 utf16字符范围内,特别用于处理 emoji 字符(HL)
    var regUtf16High = /[\ud800-\udbff]+/;
    var regUtf16Low = /[\udc00-\udfff]+/;
    var htmlEntities = [];
    var i = 0;
    var prefix = radix === 10 ? "&#" : "&#x";
    while (i < text.length) {
        var char1 = text.charAt(i);
        //如果是 emoji 字符
        if (regUtf16High.test(char1) && i < text.length - 1) {
            var char2 = text.charAt(i + 1);
            if (regUtf16Low.test(char2)) {
                var hCode = char1.charCodeAt(0);
                var lCode = char2.charCodeAt(0);
                var code = (hCode - 0xd800) * 0x400 + 0x10000 + lCode - 0xdc00;
                var entity =
                    prefix +
                    (radix === 10 ? code.toString() : code.toString(16)) +
                    ";";
                htmlEntities.push(entity);
                i += 2;
            }
        } else {
            var code = char1.charCodeAt(0);
            var entity =
                prefix +
                (radix === 10 ? code.toString() : code.toString(16)) +
                ";";
            htmlEntities.push(entity);
            i += 1;
        }
    }
    var htmlEntityText = htmlEntities.join("");
    return htmlEntityText;
};

测试:

convertStringToHtmlEntity('hello nick ,种花家 , Great Wall 😍😎🍜🍚',10);
/*
&#104;&#101;&#108;&#108;&#111;&#32;&#110;&#105;&#99;&#107;&#32;&#44;&#31181;&#33457;&#23478;&#32;&#44;&#32;&#71;&#114;&#101;&#97;&#116;&#32;&#87;&#97;&#108;&#108;&#32;&#128525;&#128526;&#127836;&#127834;
*/
convertStringToHtmlEntity('hello nick ,种花家 , Great Wall 😍😎🍜🍚',16);
/*
&#x68;&#x65;&#x6c;&#x6c;&#x6f;&#x20;&#x6e;&#x69;&#x63;&#x6b;&#x20;&#x2c;&#x79cd;&#x82b1;&#x5bb6;&#x20;&#x2c;&#x20;&#x47;&#x72;&#x65;&#x61;&#x74;&#x20;&#x57;&#x61;&#x6c;&#x6c;&#x20;&#x1f60d;&#x1f60e;&#x1f35c;&#x1f35a;
*/

注意:mysql数据库如果数据库编码类型为 utf8 是存储不了 emoji字符的,需要改为 utf8mb4

参考链接:
移动前端手机输入法自带emoji表情字符处理
https://blog.csdn.net/binjly/article/details/47321043

posted @ 2021-11-03 11:40  DHclly  阅读(126)  评论(0编辑  收藏  举报