文档章节

java过来emoji手机表情,mysql入库

爱coding
 爱coding
发布于 2016/05/12 13:56
字数 2052
阅读 324
收藏 0

最近入聊天记录入库发现有的数据入库报错,改数据库字符格式也不行,看到网上的例子,拿过来用了下,再次记录一下,方便有用到的朋友。

/**
     * 过滤手机emoji表情
     * author FengXiYang
     * date 2016-5-11 下午3:19:17
     * @param str
     * @return
     */
    private static String filteEmoji(String str){
         Pattern emoji = Pattern . compile ( "[\ud83c\udc00-\ud83c\udfff]|[\ud83d\udc00-\ud83d\udfff]|[\u2600-\u27ff]" ,Pattern .UNICODE_CASE | Pattern .CASE_INSENSITIVE ) ;
         Matcher emojiMatcher = emoji.matcher(str);
         if(emojiMatcher.find()) {
             return "" ;
         }
         return str;
    }

 

 

 

//20170428最新补充记录

package com.elong.titan.hotel.controller.utils;

import com.elong.titan.log.Log;
import com.elong.titan.log.item.InfoLog;

/**
 * 过滤安卓/IOS 自带emoji表情过滤工具类
* @ClassName: EmojiFilterUtil 
* @Description: TODO(这里用一句话描述这个类的作用) 
* @author xiyang.feng
* @date 2017年4月18日 下午4:14:39
 */
public class EmojiFilterUtil {
    
     public static String filter(String src) {
        Log.write(InfoLog.getInstance().setContent("EmojiFilterUtil=============" + src));
        if (src == null|| ("").equals(src)) {
            return src;
        }
        src = src.replaceAll("insert", "")  
                .replaceAll("select", "")  
                .replaceAll("update", "")  
                .replaceAll("delete", "")  
                .replaceAll("and", "")  
                .replaceAll("or", "")
                .replaceAll("<script>", "(*")
                .replaceAll("</script>", ")")
                .replaceAll("<", "&lt;")
                .replaceAll(">", "&gt;");  
        int cpCount = src.codePointCount(0, src.length());
        int firCodeIndex = src.offsetByCodePoints(0, 0);
        int lstCodeIndex = src.offsetByCodePoints(0, cpCount - 1);
        StringBuilder sb = new StringBuilder(src.length());
        for (int index = firCodeIndex; index <= lstCodeIndex;) {
            int codepoint = src.codePointAt(index);
            if (!isEmojiCharacter(codepoint)) {
                sb.append((char) codepoint);
            }
            index += ((Character.isSupplementaryCodePoint(codepoint)) ? 2 : 1);

        }
        Log.write(InfoLog.getInstance().setContent("EmojiFilterUtil=============" + src));
        return sb.toString();
    }
         
     private static boolean isEmojiCharacter(int codePoint) {
        return (codePoint >= 0x2600 && codePoint <= 0x27BF) // 杂项符号与符号字体
                || codePoint == 0x303D
                || codePoint == 0x2049
                || codePoint == 0x203C
                || (codePoint >= 0x2000 && codePoint <= 0x200F)//
                || (codePoint >= 0x2028 && codePoint <= 0x202F)//
                || codePoint == 0x205F //
                || (codePoint >= 0x2065 && codePoint <= 0x206F)//
                /* 标点符号占用区域 */
                || (codePoint >= 0x2100 && codePoint <= 0x214F)// 字母符号
                || (codePoint >= 0x2300 && codePoint <= 0x23FF)// 各种技术符号
                || (codePoint >= 0x2B00 && codePoint <= 0x2BFF)// 箭头A
                || (codePoint >= 0x2900 && codePoint <= 0x297F)// 箭头B
                || (codePoint >= 0x3200 && codePoint <= 0x32FF)// 中文符号
                || (codePoint >= 0xD800 && codePoint <= 0xDFFF)// 高低位替代符保留区域
                || (codePoint >= 0xE000 && codePoint <= 0xF8FF)// 私有保留区域
                || (codePoint >= 0xFE00 && codePoint <= 0xFE0F)// 变异选择器
                || codePoint >= 0x10000; // Plane在第二平面以上的,char都不可以存,全部都转
    }
    
    
    //以下方法为最初开发,编码不够全面,先屏蔽
//    public final static String unicodeReg = "[" + "\u4E00-\u9FBF" + // :CJK
//                                                                    // 统一表意符号
//                                                                    // (CJK
//                                                                    // Unified
//                                                                    // Ideographs)
//            "\u4DC0-\u4DFF" + // :易经六十四卦符号 (Yijing Hexagrams Symbols)
//            "\u0000-\u007F" + // :C0控制符及基本拉丁文 (C0 Control and Basic Latin)
//            "\u0080-\u00FF" + // :C1控制符及拉丁:补充-1 (C1 Control and Latin 1
//                                // Supplement)
//            "\u0100-\u017F" + // :拉丁文扩展-A (Latin Extended-A)
//            "\u0180-\u024F" + // :拉丁文扩展-B (Latin Extended-B)
//            "\u0250-\u02AF" + // :国际音标扩展 (IPA Extensions)
//            "\u02B0-\u02FF" + // :空白修饰字母 (Spacing Modifiers)
//            "\u0300-\u036F" + // :结合用读音符号 (Combining Diacritics Marks)
//            "\u0370-\u03FF" + // :希腊文及科普特文 (Greek and Coptic)
//            "\u0400-\u04FF" + // :西里尔字母 (Cyrillic)
//            "\u0500-\u052F" + // :西里尔字母补充 (Cyrillic Supplement)
//            "\u0530-\u058F" + // :亚美尼亚语 (Armenian)
//            "\u0590-\u05FF" + // :希伯来文 (Hebrew)
//            "\u0600-\u06FF" + // :阿拉伯文 (Arabic)
//            "\u0700-\u074F" + // :叙利亚文 (Syriac)
//            "\u0750-\u077F" + // :阿拉伯文补充 (Arabic Supplement)
//            "\u0780-\u07BF" + // :马尔代夫语 (Thaana)
//            // "\u07C0-\u077F"+//:西非书面语言 (N'Ko)
//            "\u0800-\u085F" + // :阿维斯塔语及巴列维语 (Avestan and Pahlavi)
//            "\u0860-\u087F" + // :Mandaic
//            "\u0880-\u08AF" + // :撒马利亚语 (Samaritan)
//            "\u0900-\u097F" + // :天城文书 (Devanagari)
//            "\u0980-\u09FF" + // :孟加拉语 (Bengali)
//            "\u0A00-\u0A7F" + // :锡克教文 (Gurmukhi)
//            "\u0A80-\u0AFF" + // :古吉拉特文 (Gujarati)
//            "\u0B00-\u0B7F" + // :奥里亚文 (Oriya)
//            "\u0B80-\u0BFF" + // :泰米尔文 (Tamil)
//            "\u0C00-\u0C7F" + // :泰卢固文 (Telugu)
//            "\u0C80-\u0CFF" + // :卡纳达文 (Kannada)
//            "\u0D00-\u0D7F" + // :德拉维族语 (Malayalam)
//            "\u0D80-\u0DFF" + // :僧伽罗语 (Sinhala)
//            "\u0E00-\u0E7F" + // :泰文 (Thai)
//            "\u0E80-\u0EFF" + // :老挝文 (Lao)
//            "\u0F00-\u0FFF" + // :藏文 (Tibetan)
//            "\u1000-\u109F" + // :缅甸语 (Myanmar)
//            "\u10A0-\u10FF" + // :格鲁吉亚语 (Georgian)
//            "\u1100-\u11FF" + // :朝鲜文 (Hangul Jamo)
//            "\u1200-\u137F" + // :埃塞俄比亚语 (Ethiopic)
//            "\u1380-\u139F" + // :埃塞俄比亚语补充 (Ethiopic Supplement)
//            "\u13A0-\u13FF" + // :切罗基语 (Cherokee)
//            "\u1400-\u167F" + // :统一加拿大土著语音节 (Unified Canadian Aboriginal
//                                // Syllabics)
//            "\u1680-\u169F" + // :欧甘字母 (Ogham)
//            "\u16A0-\u16FF" + // :如尼文 (Runic)
//            "\u1700-\u171F" + // :塔加拉语 (Tagalog)
//            "\u1720-\u173F" + // :Hanunóo
//            "\u1740-\u175F" + // :Buhid
//            "\u1760-\u177F" + // :Tagbanwa
//            "\u1780-\u17FF" + // :高棉语 (Khmer)
//            "\u1800-\u18AF" + // :蒙古文 (Mongolian)
//            "\u18B0-\u18FF" + // :Cham
//            "\u1900-\u194F" + // :Limbu
//            "\u1950-\u197F" + // :德宏泰语 (Tai Le)
//            "\u1980-\u19DF" + // :新傣仂语 (New Tai Lue)
//            "\u19E0-\u19FF" + // :高棉语记号 (Kmer Symbols)
//            "\u1A00-\u1A1F" + // :Buginese
//            "\u1A20-\u1A5F" + // :Batak
//            "\u1A80-\u1AEF" + // :Lanna
//            "\u1B00-\u1B7F" + // :巴厘语 (Balinese)
//            "\u1B80-\u1BB0" + // :巽他语 (Sundanese)
//            "\u1BC0-\u1BFF" + // :Pahawh Hmong
//            "\u1C00-\u1C4F" + // :雷布查语(Lepcha)
//            "\u1C50-\u1C7F" + // :Ol Chiki
//            "\u1C80-\u1CDF" + // :曼尼普尔语 (Meithei/Manipuri)
//            "\u1D00-\u1D7F" + // :语音学扩展 (Phone tic Extensions)
//            "\u1D80-\u1DBF" + // :语音学扩展补充 (Phonetic Extensions Supplement)
//            "\u1DC0-\u1DFF" + // 结合用读音符号补充 (Combining Diacritics Marks
//                                // Supplement)
//            "\u1E00-\u1EFF" + // :拉丁文扩充附加 (Latin Extended Additional)
//            "\u1F00-\u1FFF" + // :希腊语扩充 (Greek Extended)
//            "\u2000-\u206F" + // :常用标点 (General Punctuation)
//            "\u2070-\u209F" + // :上标及下标 (Superscripts and Subscripts)
//            "\u20A0-\u20CF" + // :货币符号 (Currency Symbols)
//            "\u20D0-\u20FF" + // :组合用记号 (Combining Diacritics Marks for Symbols)
//            "\u2100-\u214F" + // :字母式符号 (Letterlike Symbols)
//            "\u2150-\u218F" + // :数字形式 (Number Form)
//            "\u2190-\u21FF" + // :箭头 (Arrows)
//            "\u2200-\u22FF" + // :数学运算符 (Mathematical Operator)
//            "\u2300-\u23FF" + // :杂项工业符号 (Miscellaneous Technical)
//            "\u2400-\u243F" + // :控制图片 (Control Pictures)
//            "\u2440-\u245F" + // :光学识别符 (Optical Character Recognition)
//            "\u2460-\u24FF" + // :封闭式字母数字 (Enclosed Alphanumerics)
//            "\u2500-\u257F" + // :制表符 (Box Drawing)
//            "\u2580-\u259F" + // :方块元素 (Block Element)
//            "\u25A0-\u25FF" + // :几何图形 (Geometric Shapes)
//            "\u2600-\u26FF" + // :杂项符号 (Miscellaneous Symbols)
//            "\u2700-\u27BF" + // :印刷符号 (Dingbats)
//            "\u27C0-\u27EF" + // :杂项数学符号-A (Miscellaneous Mathematical
//                                // Symbols-A)
//            "\u27F0-\u27FF" + // :追加箭头-A (Supplemental Arrows-A)
//            "\u2800-\u28FF" + // :盲文点字模型 (Braille Patterns)
//            "\u2900-\u297F" + // :追加箭头-B (Supplemental Arrows-B)
//            "\u2980-\u29FF" + // :杂项数学符号-B (Miscellaneous Mathematical
//                                // Symbols-B)
//            "\u2A00-\u2AFF" + // :追加数学运算符 (Supplemental Mathematical Operator)
//            "\u2B00-\u2BFF" + // :杂项符号和箭头 (Miscellaneous Symbols and Arrows)
//            "\u2C00-\u2C5F" + // :格拉哥里字母 (Glagolitic)
//            "\u2C60-\u2C7F" + // :拉丁文扩展-C (Latin Extended-C)
//            "\u2C80-\u2CFF" + // :古埃及语 (Coptic)
//            "\u2D00-\u2D2F" + // :格鲁吉亚语补充 (Georgian Supplement)
//            "\u2D30-\u2D7F" + // :提非纳文 (Tifinagh)
//            "\u2D80-\u2DDF" + // :埃塞俄比亚语扩展 (Ethiopic Extended)
//            "\u2E00-\u2E7F" + // :追加标点 (Supplemental Punctuation)
//            "\u2E80-\u2EFF" + // :CJK 部首补充 (CJK Radicals Supplement)
//            "\u2F00-\u2FDF" + // :康熙字典部首 (Kangxi Radicals)
//            "\u2FF0-\u2FFF" + // :表意文字描述符 (Ideographic Description Characters)
//            "\u3000-\u303F" + // :CJK 符号和标点 (CJK Symbols and Punctuation)
//            "\u3040-\u309F" + // :日文平假名 (Hiragana)
//            "\u30A0-\u30FF" + // :日文片假名 (Katakana)
//            "\u3100-\u312F" + // :注音字母 (Bopomofo)
//            "\u3130-\u318F" + // :朝鲜文兼容字母 (Hangul Compatibility Jamo)
//            "\u3190-\u319F" + // :象形字注释标志 (Kanbun)
//            "\u31A0-\u31BF" + // :注音字母扩展 (Bopomofo Extended)
//            "\u31C0-\u31EF" + // :CJK 笔画 (CJK Strokes)
//            "\u31F0-\u31FF" + // :日文片假名语音扩展 (Katakana Phonetic Extensions)
//            "\u3200-\u32FF" + // :封闭式 CJK 文字和月份 (Enclosed CJK Letters and
//                                // Months)
//            "\u3300-\u33FF" + // :CJK 兼容 (CJK Compatibility)
//            "\u3400-\u4DBF" + // :CJK 统一表意符号扩展 A (CJK Unified Ideographs
//                                // Extension A)
//            "\u4DC0-\u4DFF" + // :易经六十四卦符号 (Yijing Hexagrams Symbols)
//            "\u4E00-\u9FBF" + // :CJK 统一表意符号 (CJK Unified Ideographs)
//            "\uA000-\uA48F" + // :彝文音节 (Yi Syllables)
//            "\uA490-\uA4CF" + // :彝文字根 (Yi Radicals)
//            "\uA500-\uA61F" + // :Vai
//            "\uA660-\uA6FF" + // :统一加拿大土著语音节补充 (Unified Canadian Aboriginal
//                                // Syllabics Supplement)
//            "\uA700-\uA71F" + // :声调修饰字母 (Modifier Tone Letters)
//            "\uA720-\uA7FF" + // :拉丁文扩展-D (Latin Extended-D)
//            "\uA800-\uA82F" + // :Syloti Nagri
//            "\uA840-\uA87F" + // :八思巴字 (Phags-pa)
//            "\uA880-\uA8DF" + // :Saurashtra
//            "\uA900-\uA97F" + // :爪哇语 (Javanese)
//            "\uA980-\uA9DF" + // :Chakma
//            "\uAA00-\uAA3F" + // :Varang Kshiti
//            "\uAA40-\uAA6F" + // :Sorang Sompeng
//            "\uAA80-\uAADF" + // :Newari
//            "\uAB00-\uAB5F" + // :越南傣语 (Vi?t Thái)
//            "\uAB80-\uABA0" + // :Kayah Li
//            "\uAC00-\uD7AF" + // :朝鲜文音节 (Hangul Syllables)
//            // "\uD800-\uDBFF"+//:High-half zone of UTF-16
//            // "\uDC00-\uDFFF"+//:Low-half zone of UTF-16
//            "\uE000-\uF8FF" + // :自行使用区域 (Private Use Zone)
//            "\uF900-\uFAFF" + // :CJK 兼容象形文字 (CJK Compatibility Ideographs)
//            "\uFB00-\uFB4F" + // :字母表达形式 (Alphabetic Presentation Form)
//            "\uFB50-\uFDFF" + // :阿拉伯表达形式A (Arabic Presentation Form-A)
//            "\uFE00-\uFE0F" + // :变量选择符 (Variation Selector)
//            "\uFE10-\uFE1F" + // :竖排形式 (Vertical Forms)
//            "\uFE20-\uFE2F" + // :组合用半符号 (Combining Half Marks)
//            "\uFE30-\uFE4F" + // :CJK 兼容形式 (CJK Compatibility Forms)
//            "\uFE50-\uFE6F" + // :小型变体形式 (Small Form Variants)
//            "\uFE70-\uFEFF" + // :阿拉伯表达形式B (Arabic Presentation Form-B)
//            "\uFF00-\uFFEF" + // :半型及全型形式 (Halfwidth and Fullwidth Form)
//            "\uFFF0-\uFFFF]";// :特殊 (Specials);
//
//    /**
//     * 将字符串转成unicode
//     * @param str 待转字符串
//     * @return unicode字符串
//     */
//    public static String convert(String str) {
//        str = (str == null ? "" : str);
//        String tmp;
//        StringBuffer sb = new StringBuffer(1000);
//        char c;
//        int i, j;
//        sb.setLength(0);
//        for (i = 0; i < str.length(); i++) {
//            c = str.charAt(i);
//            sb.append("\\u");
//            j = (c >>> 8); // 取出高8位
//            tmp = Integer.toHexString(j);
//            if (tmp.length() == 1) {
//                sb.append("0");
//            }
//            sb.append(tmp);
//            j = (c & 0xFF); // 取出低8位
//            tmp = Integer.toHexString(j);
//            if (tmp.length() == 1) {
//                sb.append("0");
//            }
//            sb.append(tmp);
//
//        }
//        return (new String(sb).toUpperCase());
//    }

//    /**
//     * 2)unicode转成字符串,与上述过程反向操作即可 将unicode 字符串
//     * @param str 待转字符串
//     * @return 普通字符串
//     */
//    public static String revert(String str) {
//        str = (str == null ? "" : str);
//        if (str.indexOf("\\u") == -1)// 如果不是unicode码则原样返回
//            return str;
//
//        StringBuffer sb = new StringBuffer(1000);
//
//        for (int i = 0; i < str.length() - 6;) {
//            String strTemp = str.substring(i, i + 6);
//            String value = strTemp.substring(2);
//            int c = 0;
//            for (int j = 0; j < value.length(); j++) {
//                char tempChar = value.charAt(j);
//                int t = 0;
//                switch (tempChar) {
//                case 'a':
//                    t = 10;
//                    break;
//                case 'b':
//                    t = 11;
//                    break;
//                case 'c':
//                    t = 12;
//                    break;
//                case 'd':
//                    t = 13;
//                    break;
//                case 'e':
//                    t = 14;
//                    break;
//                case 'f':
//                    t = 15;
//                    break;
//                default:
//                    t = tempChar - 48;
//                    break;
//                }
//
//                c += t * ((int) Math.pow(16, (value.length() - j - 1)));
//            }
//            sb.append((char) c);
//            i = i + 6;
//        }
//        return sb.toString();
//    }
//
//    public static String emojiChange(String source) {
//        if(!StringUtils.isNotBlank(source)){  
//            return source;
//        }
//        source = source.replaceAll("insert", "")  
//                .replaceAll("select", "")  
//                .replaceAll("update", "")  
//                .replaceAll("delete", "")  
//                .replaceAll("and", "")  
//                .replaceAll("or", "")
//                .replaceAll("<script>", "(*")
//                .replaceAll("</script>", ")")
//                .replaceAll("<", "&lt;")
//                .replaceAll(">", "&gt;");  
//        source = source.replaceAll("[\\ud800\\udc00-\\udbff\\udfff\\ud800-\\udfff]", "");  
//        try {
//            Pattern pattern = Pattern.compile(unicodeReg);
//            StringBuffer sbBuffer = new StringBuffer();
//            for (int i = 0; i < source.length(); i++) {
//                char c = source.charAt(i);
//                String temp = String.valueOf(c);
//                Matcher matcher = pattern.matcher(temp);
//                if (matcher.find()) {
//                    sbBuffer.append(temp);
//                } else {
//                    sbBuffer.append("");
//                }
//            }
//            return sbBuffer.toString();
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//        return "";
//    }
    
}
 

 

© 著作权归作者所有

爱coding
粉丝 25
博文 52
码字总数 29892
作品 0
昌平
程序员
私信 提问
加载中

评论(1)

olacacalee
olacacalee
我前一段时间正好做这个,因为有事就暂时搁置了,突然看到你这篇文章,有个疑问。我看你这个方法只是过滤emoji,那你怎么存入数据库呢。举个例子,我在评论中输入一句话:“你好(0)”,我存入到数据库里是什么样子,那我怎么在显示的时候也显示出来这个表情呢?
不要在MySQL中使用utf8,改用utf8mb4

mysql官网对字符集的说明:https://dev.mysql.com/doc/refman/8.0/en/charset-unicode.html 一、为什么需要使用utf8mb4。 在mysql、MariaDB中: MySQL的“utf8mb4”是真正的“UTF-8”。长度是...

王坤charlie
05/15
30
3
让Mysql支持Emoji表情

Java 获取到微信端传递过来的Emoji表情插入MySQL之后报错 , 错误信息如下 java.sql.SQLException: Incorrect string value: 'xF0x9Fx92x94' for column 'name' at row 1 at com.mysql.jdbc......

小黑白
2015/08/13
325
0
微信nickname乱码(emoji)及mysql编码格式设置(utf8mb4)解决的过程

网上的解决办法大多是修改my.cnf参数,设置mysql的编码为utf8mb4,这种方法虽然彻底,但是通常要重启mysql,会造成生产系统临时当机。我认为写的比较好的方法是:mysql/Java服务端对emoji的支...

Jack088
05/16
174
0
过滤字符串中的Emoji表情[转]

iOS 5.0之前,苹果都是采用3个字节来承接 emoji 表情,Java 的普通 char 可以支持显示。但 iOS 5.0 之后, 苹果升级了系统自带的 emoji 表情输入法,用的 Unicode 6 标准来统一,是采用4个 ...

彭博
2013/04/08
41.5K
8
关于Druid连接mysql的乱码问题(utf8mb4)

在开发过程中需要爬取一些数据,其中包含emoji表情,所以需要使用utf8mb4进行数据库的连接,在开发环境我自行搭建的mysql服务没有出现问题。 但在生产环境使用的是AWS的云服务,则不能正常连...

SethOS
2017/08/11
2.1K
1

没有更多内容

加载失败,请刷新页面

加载更多

parseint和isNaN用法

本文转载于:专业的前端网站➭parseint和isNaN用法 <!doctype html><html><head><meta charset="utf-8"><title>无标题文档</title></head><body><script> var a='12'; alert......

前端老手
42分钟前
7
0
Kylin 精确去重在用户行为分析中的妙用

作者:史少锋,Apache Kylin committer & PMC,2019/10/11 在上次文章《如何在 1 秒内做到大数据精准去重》中,我们介绍了 Apache Kylin 为什么要支持大数据集上的精确去重,以及基于 Bitmap...

ApacheKylin
53分钟前
5
0
学习记录(二) es6基本语法(rest参数,模板化,axios模块,拦截器)

日常学习记录 模块化:把一个大文件分成多个小文件,按照一定规范进行拼接 es5写法: 导出:module.exports = 数据 导入:require("路径") /路径未添加后缀名时 //默认添加.js //把路径作为文件名...

Pole丶逐
57分钟前
4
0
以程序员的角度怎么购买一台「性价比高的电视」

前俩天有小伙伴在我的文章下留言,说能否把 【国内电视机都介绍一下】,今天我已在TV端开发多年的程序员的角度。谈谈已程序员的角度如何购买一台性价比高的电视。 国内大的电视机品牌介绍 长...

我们都很努力着
今天
4
0
PhotoShop 色调:理解直方图/RGB通道信息

一、直方图:图表的形式,展示图像像素分布的情况 1.平均值:表示平均亮度 2.标准偏差值:表示亮度值范围内的中间值 3.像素: 表示用于计算直方图的像素总数 4.色阶:显示指针下面的区域亮度...

东方墨天
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部