emoji处理方法
在做微信公众号开发时碰到了获取微信基本信息的需求,但是在像数据库保存用户昵称的时候出错了,
出错原因是微信用户的昵称中包含emoji等特殊符号,表情图片,
mysql数据库使用的是utf8,最大存储3个字节,而emoji等以4个字节进行的保存,所以保存不了
处理方法:
1:修改数据库编码由utf8升级为utf8mb4,utf8mb4是utf8的超级,包含全部unicode编码;该方法没有具体操作;
2:进行过滤,对获取到的用户昵称进行编码过滤,对emoji等替换为“”空;但是该方法在碰到iso上的一些emoji就失败了。在下方增加了一些处理过滤方法;
该过滤方法找自于网上
/**
* 检测是否有emoji字符
* @param source
* @return 一旦含有就抛出
*/
public static boolean containsEmoji(String source) {
if (StringUtils.isBlank(source)) {
return false;
} int len = source.length(); for (int i = ; i < len; i++) {
char codePoint = source.charAt(i); if (isEmojiCharacter(codePoint)) {
//do nothing,判断到了这里表明,确认有表情字符
return true;
}
} return false;
} private static boolean isEmojiCharacter(char codePoint) {
return (codePoint == 0x0) ||
(codePoint == 0x9) ||
(codePoint == 0xA) ||
(codePoint == 0xD) ||
((codePoint >= 0x20) && (codePoint <= 0xD7FF)) ||
((codePoint >= 0xE000) && (codePoint <= 0xFFFD)) ||
((codePoint >= 0x10000) && (codePoint <= 0x10FFFF));
} /**
* 过滤emoji 或者 其他非文字类型的字符
* @param source
* @return
*/
public static String filterEmoji(String source) { if (!containsEmoji(source)) {
//特殊处理
source = filterSpecialCharacter(source);
return source;//如果不包含,直接返回
}
//到这里铁定包含
StringBuilder buf = null; int len = source.length(); for (int i = ; i < len; i++) {
char codePoint = source.charAt(i); if (isEmojiCharacter(codePoint)) {
if (buf == null) {
buf = new StringBuilder(source.length());
} buf.append(codePoint);
} else {
}
} if (buf == null) {
return source;//如果没有找到 emoji表情,则返回源字符串
} else {
if (buf.length() == len) {//这里的意义在于尽可能少的toString,因为会重新生成字符串
buf = null;
return source;
} else {
return buf.toString();
}
} }
/**
* 判断特殊字符,替换成空格
*
* @param source
* @return 过滤后的字符串
*/
public static String filterSpecialCharacter(String source) {
if(StringUtils.isNotBlank(source)){
Pattern emoji = Pattern.compile("[\ud83c\udc00-\ud83c\udfff]|[\ud83d\udc00-\ud83d\udfff]|[\u2600-\u27ff]",Pattern . UNICODE_CASE | Pattern . CASE_INSENSITIVE);
Matcher emojiMatcher = emoji.matcher(source);
if (emojiMatcher.find()) {
return source.replaceAll("[\\ud800\\udc00-\\udbff\\udfff\\ud800-\\udfff]", "");
}else{
return source;
}
}else{
return source;
}
}
方法3:
/**
* 过滤掉超过3个字节的UTF8字符
* @param text
* @return
* @throws UnsupportedEncodingException
*/
public static String filterOffUtf8Mb4(String text) throws UnsupportedEncodingException {
byte[] bytes = text.getBytes("utf-8");
ByteBuffer buffer = ByteBuffer.allocate(bytes.length);
int i = ;
while (i < bytes.length) {
short b = bytes[i];
if (b > ) {
buffer.put(bytes[i++]);
continue;
} b += ; // 去掉符号位 if (((b >> ) ^ 0x6) == ) {
buffer.put(bytes, i, );
i += ;
} else if (((b >> ) ^ 0xE) == ) {
buffer.put(bytes, i, );
i += ;
} else if (((b >> ) ^ 0x1E) == ) {
i += ;
} else if (((b >> ) ^ 0x3E) == ) {
i += ;
} else if (((b >> ) ^ 0x7E) == ) {
i += ;
} else {
buffer.put(bytes[i++]);
}
}
buffer.flip();
return new String(buffer.array(), "utf-8");
}
方法4:进行编码转换保存
将需要处理的字符串进行编码转换,存储到数据库
/**
* 字符串转换ascii
*/
public static String string2Unicode(String string) {
StringBuffer unicode = new StringBuffer();
for (int i = ; i < string.length(); i++) {
// 取出每一个字符
char c = string.charAt(i);
// 转换为unicode
unicode.append("\\u" + Integer.toHexString(c));
}
return unicode.toString();
}
/**
* ascii 转字符串
*/
public static String unicode2String(String unicode) {
StringBuffer string = new StringBuffer();
String[] hex = unicode.split("\\\\u");
for (int i = ; i < hex.length; i++) {
// 转换出每一个代码点
int data = Integer.parseInt(hex[i], );
// 追加成string
string.append((char) data);
}
return string.toString();
}
在页面获取的时候进行处理
//js ascii转string
function ascii2native(){
//var character=document.getElementById("nikeunicode").value.split("\\u");
var x=document.getElementsByClassName("nikeunicode"); var k;
for (k = ; k < x.length; k++) {
console.log(x[k].innerHTML);
var character=x[k].innerHTML.split("\\u");
var native=character[];
console.log(native);
for(var i=;i<character.length;i++){
var code=character[i];
native+=String.fromCharCode(parseInt("0x"+code.substring(,)));
if(code.length>){
native+=code.substring(,code.length);
}
}
x[k].innerHTML=native;
} //document.getElementById("nikeunicode").value=native1;
}
页面处理过的效果
上文中的方法在android输入法自带的emoji下,没有起到效果,在上文方法2的if (isEmojiCharacter(codePoint)) 处加入下列判断
private static boolean isChinese(char c) {
Character.UnicodeScript sc = Character.UnicodeScript.of(c);
if (sc == Character.UnicodeScript.HAN) {
return true;
}
return false;
}
public static boolean isPunctuation(char c) {
Character.UnicodeBlock ub = Character.UnicodeBlock.of(c);
if ( // punctuation, spacing, and formatting characters
ub == Character.UnicodeBlock.GENERAL_PUNCTUATION
// symbols and punctuation in the unified Chinese, Japanese and Korean script
|| ub == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION
// fullwidth character or a halfwidth character
|| ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS
// vertical glyph variants for east Asian compatibility
|| ub == Character.UnicodeBlock.CJK_COMPATIBILITY_FORMS
// vertical punctuation for compatibility characters with the Chinese Standard GB 18030
|| ub == Character.UnicodeBlock.VERTICAL_FORMS
// ascii
|| ub == Character.UnicodeBlock.BASIC_LATIN
) {
return true;
} else {
return false;
}
}
private static Boolean isUserDefined(char c) {
Character.UnicodeBlock ub = Character.UnicodeBlock.of(c);
if (ub == Character.UnicodeBlock.NUMBER_FORMS
|| ub == Character.UnicodeBlock.ENCLOSED_ALPHANUMERICS
|| ub == Character.UnicodeBlock.LETTERLIKE_SYMBOLS
|| c == '\ufeff'
|| c == '\u00a0'
)
return true;
return false;
}
public static boolean isMessy(String str) {
float chlength = ;
float count = ;
for(int i = ; i < str.length(); i++) {
char c = str.charAt(i);
if(isPunctuation(c) || isUserDefined(c))
continue;
else {
if(!isChinese(c)) {
count = count + ;
}
chlength ++;
}
}
float result = count / chlength;
if(result > 0.3){
return true;
}else{
return false;
}
}
emoji处理方法的更多相关文章
- emoji处理方法汇总
emoji资料 今天研究了emoji,挺有意思,资料挺多,摘要一些信息给大家分享,也算是自己记录学习. emoji介绍 Emoji (絵文字,词义来自日语えもじ,e-moji,moji在日语中的含义是 ...
- 前端如何处理emoji表情
这段时间在做移动端的开发, 有一个功能就是发表评论,其实这个功能本身是比较简单的, 但是在提测是的时候QA给哦提了一个bug,说输入手机自带的emoji表情发送失败了.我就奇怪了,emoji表情也是文 ...
- 微信昵称的emoji的尝试性解决方案
概述 之前分享过前端页面使用emoji,讨论了前端页面使用emoji的方法,但是微信昵称中的emoji怎么获取和显示呢?我查找了一些资料,把心得记录下来,供以后开发时参考,相信对其他人也有用. 转码问 ...
- Java转义emoji等特殊符号
写在前面 网上找了很多转emoji等方法,大多有两种方法 更改数据库编码格式为utf8mb4 过滤字符串中的emoji 都不是很优雅 更改数据库编码,势必影响其他数据库 过滤emoj效率比较低 处理E ...
- Android Emoji兼容包使用详解
Emoji兼容性 我们经常会遇到这样的问题: 给朋友发的emoji表情, 在自己手机上展示是正常的, 但是到朋友手机上, 却没有展示出来, 或者展示出来了, 但是也跟自己手机上展示的不一样. 所以, ...
- filter 过滤emoji
拦截器 public class EmojiFilter implements Filter { private FilterConfig filterConfig; public void init ...
- 宅在家学不进去吗?试试这些 GitHub 上简单易学的游戏项目吧
作者:HelloGitHub-小鱼干 这是本人宅在家里的第 4 周,代码不想看,技术文章不想读,都不能愉快学习了我还怎么当一个优秀的需求消化师呢?有没有什么轻松地方法来学习技术呢?想起了小时候金山打字 ...
- javaSE27天复习总结
JAVA学习总结 2 第一天 2 1:计算机概述(了解) 2 (1)计算机 2 (2)计算机硬件 2 (3)计算机软件 2 (4)软件开发(理解) 2 (5) ...
- Django1.10+Mysql 5.7存储emoji表情,报Incorrect string value: '\\xF0\\x9F\\x90\\xA8' for column 'signature' at row 1的解决方法
问题: 在做webapp项目的时候,用户提交emoji数据,控制台报错:Incorrect string value: '\\xF0\\x9F\\x90\\xA8' for column 'signa ...
随机推荐
- Python lambda 多变量
>> x = list(map(lambda x, y: (x>3, y>0), (1,2,3,4,5), (0,1,2,3,4)))>>> x[(False ...
- Hadoop中的排序和连接
MapReduce的全排序 主要是为了保证分区排序,即第一个分区的最后一个Key值小于第二个分区的第一个Key值 与普通的排序仅仅多一个自定义分区类MyPartitioner见自己所写的实验 (设置一 ...
- JMeter生成UUID方式
1. 使用JMeter工具中自带的函数__UUID 2. 使用Beanshell组件,在脚本中引入java.util.UUID,通过java来生成 import java.util.UUID; UUI ...
- ps示例
博客PS示例 一显示指定真正用户名(RUID)或用户ID的进程 打开另外一个终端 [root@centos72 ~]# id wang uid=1000(wang) gid=1000(wang) gr ...
- spring-boot整合Mybatis案例(注解方式)
1.运行环境 开发工具:intellij idea JDK版本:1.8 项目管理工具:Maven 4.0.0 2.GITHUB地址 https://github.com/nbfujx/springBo ...
- Vue的使用总结(1)
1.将某个对象赋值给vue实例中的data属性时是浅拷贝 var obj= { a: 1 } var vm = new Vue({ data: obj }) obj.a = 2; console.lo ...
- AT2070 Card Game for Three(组合数学)
传送门 解题思路 前面的思路还是很好想的,就是要枚举最后一个\(a\)在哪出现算贡献,之后我先想的容斥,结果彻底偏了..后来调了很久发现自己傻逼了,似乎不能容斥,终于走上正轨23333.首先可以写出一 ...
- blob格式导出文件
最近在做blob流导出相关功能,其中需要导出excel.csv.word.zip压缩文件之类的,在导出excel和word中需要知道对应的content-type属性,正好看到下面这篇文章,感觉挺好的 ...
- Hadoop 架构与原理
1.1. Hadoop架构 Hadoop1.0版本两个核心:HDFS+MapReduce Hadoop2.0版本,引入了Yarn.核心:HDFS+Yarn+Mapreduce Yarn是资源调度框 ...
- 20150721—HTML的定位 JS (转)
本文转载于:http://blog.csdn.net/xuantian868/article/details/3116442 HTML:scrollLeft,scrollWidth,clientW ...