emoj表情保存,emoj错误

来源:互联网 发布:苹果手机清除数据 编辑:程序博客网 时间:2024/04/30 05:07
前端时间开发app服务,在网上爬取文章时,总是在保存特定的几条内容时出现sql错误,如下图:
java.sql.SQLException:Incorrect string value: '\xf0\x9f' ...  等错误,经过分析发现时改文章包含表情emoj符号,在保存数据的时候,mysql数据库设置的编码为UTF-8格式,并不支持,对应的支持编码为utf8mb4 ,可是在设计数据库的时候并没有想到emoj表情的的事情,现在如果修改数据类型,对应的程序链接也需要修改,不能指定编码格式,未知的问题不清楚,最后的解决方案只能是过滤掉文章中包含的emoj表情符号,
后续app会出聊天程序,设置成utf8mb4也是不可避免的。



过滤方案如下:
/**     * 替换四个字节的字符 ‘\xF0\x9F\x98\x84\xF0\x9F)的解决方案 ??     * @author     * @data 2015年8月11日 上午10:31:50     * @param content     * @return     */    public static String removeFourChar(String content) {        byte[] conbyte = content.getBytes();        for (int i = 0; i < conbyte.length; i++) {            if ((conbyte[i] & 0xF8) == 0xF0) {                for (int j = 0; j < 4; j++) {                                              conbyte[i+j]=0x30;                                     }                  i += 3;            }        }        content = new String(conbyte);        return content.replaceAll("0000", "");    }


关于emoj相关的知识点:
/**
*
* 本类的主要功能是将带有emoji的字符串,格式化成unicode字符串,并且提供可见unicode字符反解成emoji字符
*
*
* 相关识知点:
* <b>
* Unicode平面,
* BMP的字符可以使用charAt(index)来处理,计数可以使用length()
* 其它平面字符,需要用codePointAt(index),计数可以使用codePointCount(0,str.lenght())</b>
*
* Unicode可以逻辑分为17平面(Plane),每个平面拥有65536( = 216)个代码点,虽然目前只有少数平面被使
* 用。
* 平面0 (0000–FFFF): 基本多文种平面(Basic Multilingual Plane, BMP).
* 平面1 (10000–1FFFF): 多文种补充平面(Supplementary Multilingual Plane, SMP).
* 平面2 (20000–2FFFF): 表意文字补充平面(Supplementary Ideographic Plane, SIP).
* 平面3 (30000–3FFFF): 表意文字第三平面(Tertiary Ideographic Plane, TIP).
* 平面4 to 13 (40000–DFFFF)尚未使用
* 平面14 (E0000–EFFFF): 特别用途补充平面(Supplementary Special-purpose Plane, SSP)
* 平面15 (F0000–FFFFF)保留作为私人使用区(Private Use Area, PUA)
* 平面16 (100000–10FFFF),保留作为私人使用区(Private Use Area, PUA)
*
* 参考:
* 维基百科: http://en.wikipedia.org/wiki/Emoji
* GITHUB: http://punchdrunker.github.io/iOSEmoji/
* 杂项象形符号:1F300-1F5FF
* 表情符号:1F600-1F64F
* 交通和地图符号:1F680-1F6FF
* 杂项符号:2600-26FF
* 符号字体:2700-27BF
* 国旗:1F100-1F1FF
* 箭头:2B00-2BFF 2900-297F
* 各种技术符号:2300-23FF
* 字母符号: 2100–214F
* 中文符号: 303D 3200–32FF 2049 203C
* Private Use Area:E000-F8FF;
* High Surrogates D800..DB7F;
* High Private Use Surrogates DB80..DBFF
* Low Surrogates DC00..DFFF D800-DFFF E000-F8FF
* 标点符号:2000-200F 2028-202F 205F 2065-206F
* 变异选择器:IOS独有 FE00-FE0F
* /


如果有表情的unicode码大于4位 比如 1f20b 代表笑脸

Character.toChars(Integer.parseInt("1f60d", 16)) 使用这种方法可以打印


0 0
原创粉丝点击