java关于安卓,苹果输入表情数据库处理

news/2024/10/23 16:19:08/

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

在APP开发中,大多需要涉及表情符号丰富APP的亲和力,但是因为我们的数据库一般是utf8编码,是3个字节,而表情符号基本都是四个字节的unicode编码。以下是通过emoji-Java解决数据库不能存储4字节表情符号的问题。

个人看法:

    1.1:其实就是app录入表情后,传到后台在保存数据库的时候,编码问题.  把表情变成数据库想要的编码不就    妥了!  哦了就这么干,,,,,  对于存到数据库之后,用户查看的时候要的是表情,所以再把它转回来表情就ok 了!!!

    1.2:还有个办法就是:把数据库变为能接受表情编码的编码格式就妥了!!(这种方式适用刚刚创建数据库),

    参考:http://blog.itpub.net/26230597/viewspace-1243233/ 

网上有很多类似的讲解.下面说说第一个转编码的方法!!!!

 

   1.在你的pom文件中导入以下坐标,可能不是最新的,需要最新的请到github搜索

<dependency><groupId>com.vdurmont</groupId><artifactId>emoji-java</artifactId><version>3.2.0</version>
</dependency>

基本就是这两行代码来回玩,   存数据库,    读数据库展示.........

EmojiParser.parseToAliases(string); 将表情符号转为字符   (转化字符存入数据库)
EmojiParser.parseToUnicode(string); 将字符转为表情符号 (读取数据库转化为表情)

来个栗子,

//转换表情 存数据库 if(StringUtils.isNotBlank(content)){  String  content= EmojiParser.parseToAliases(content);  }  
//转化表情符号if(StringUtils.isNotBlank(content)){  String  content= EmojiParser.parseToUnicode(content);  } 

很好理解,每次在碰到有输入表情的地方   保存数据库之前 转化一下下,  读取数据库展示的时候,再转回来即可!!!

2,用了一段时间后,慢慢就发现部分表情不能转化.发现是苹果手机输入法的部分表情转化还是不能转化,尤其对于ios10系统以后的表情。顿时犯了难,每次发表内容的时候都不成功!   找了好多资料,能解决一部分表情.但是以后还是会报错!!!!!!!!!!!!   最后一个办法   就是碰见不能转化的 全部变为   方框  展示 !!(是把上个方法转化后,不能转化的 替换成框  不是所有! )

直接整栗子:

package com.zsj.utils;import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.regex.Matcher;
import java.util.regex.Pattern;import org.apache.log4j.Logger;
import org.base.utils.MD5Tools;
import org.base.utils.http.HttpTools;import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;public class EmojiUtils {private static Logger LOG = Logger.getLogger(EmojiUtils.class);/*** 表情转换处理* @param phone* @param content* @return* @throws UnsupportedEncodingException *//*public static String parseToAliases(String cont) throws UnsupportedEncodingException{String content = "";String bb = cont;for (int i = 0; i < cont.length(); i++) {// 取出每一个字符char c = bb.charAt(i);String aa = String.valueOf(c);System.out.println(aa);int length = aa.getBytes("UTF-8").length;Pattern pattern = Pattern.compile("^[-\\+]?[\\d]*$");  boolean matches = pattern.matcher(aa).matches();Character.UnicodeBlock ub = Character.UnicodeBlock.of(c);  Pattern p = Pattern.compile("[a-zA-z]");if(length==1){if(matches){content+=aa;}else if(ub == Character.UnicodeBlock.GENERAL_PUNCTUATION  || ub == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION  || ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS  || ub == Character.UnicodeBlock.CJK_COMPATIBILITY_FORMS  || ub == Character.UnicodeBlock.VERTICAL_FORMS){content+=aa;}else if(p.matcher(aa).find()){content+=aa;}else if(aa.equals(":")){content+=aa;}else if(aa.equals("@")){content+=aa;}else if(aa.equals("#")){content+=aa;}else if(aa.equals("$")){content+=aa;}else if(aa.equals("%")){content+=aa;}else if(aa.equals("^")){content+=aa;}else if(aa.equals("&")){content+=aa;}else if(aa.equals("*")){content+=aa;}else if(aa.equals("(")){content+=aa;}else if(aa.equals(")")){content+=aa;}else if(aa.equals("_")){content+=aa;}else if(aa.equals("-")){content+=aa;}else if(aa.equals("+")){content+=aa;}else if(aa.equals("=")){content+=aa;}else if(aa.equals("`")){content+=aa;}else if(aa.equals("~")){content+=aa;}else if(aa.equals("#")){content+=aa;}else if(aa.equals("{")){content+=aa;}else if(aa.equals("}")){content+=aa;}else if(aa.equals("|")){content+=aa;}else if(aa.equals("[")){content+=aa;}else if(aa.equals("]")){content+=aa;}else if(aa.equals(";")){content+=aa;}else if(aa.equals("'")){content+=aa;}else if(aa.equals("\"")){content+=aa;}else if(aa.equals("/")){content+=aa;}else if(aa.equals("!")){content+=aa;}else if(aa.equals(".")){content+=aa;}else if(aa.equals(",")){content+=aa;}else if(aa.equals(",")){content+=aa;}else{content+="?";}}else{content+=aa;}}System.out.println(content);return content;}*/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 string) {System.out.println("__________________________________");try {System.out.println("all-string:" + string);System.out.println("all-unicode:" + convert(string));Pattern pattern = Pattern.compile(unicodeReg);StringBuffer sbBuffer = new StringBuffer();for (int i = 0; i < string.length(); i++) {char c = string.charAt(i);String temp = String.valueOf(c);Matcher matcher = pattern.matcher(temp);if (matcher.find()) {sbBuffer.append(temp);} else {sbBuffer.append("□");}System.out.println("temp:" + temp + ";unicode:" + convert(temp));}System.out.println("sb:" + sbBuffer.toString());System.out.println("--------------------------------------");return sbBuffer.toString();} catch (Exception e) {e.printStackTrace();}return "";}public static String parseToAliases(String cont){String emojiChange = emojiChange(cont);System.out.println(emojiChange);return emojiChange;}public static void main(String[] args) throws UnsupportedEncodingException {System.out.println(EmojiUtils.parseToAliases("嘻嘻ߤ­"));}
}

直接复制上面的代码,建一个工具类 就OK了! 每次转化的时候  就得先用上面的方法,转化表情后,再来一行:

String content= EmojiUtils.parseToAliases(content);

可以把他两融合到一个工具类.之后引用一行代码即可!!!!

附表情地址:https://apps.timwhitlock.info/emoji/tables/unicode

之后有新的方法,再来一起讨论!!!!!!!!!  欢迎各位大神们指教,一起讨论!!!!!!!!!!!!!!!!!!!!

转载于:https://my.oschina.net/u/3452909/blog/2052687


http://www.ppmy.cn/news/574825.html

相关文章

库克考虑卸任苹果CEO,谁会是下一任接班人?

作者 | Carol 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 近日&#xff0c;苹果公司现任CEO Tim Cook&#xff08;蒂姆库克&#xff09;在4月5日接受采访时表示&#xff0c;目前状态还不错&#xff0c;暂时不会卸任&#xff0c;但10年太久了&#xff0c;不可能…

Windows 应用生成MiniDump文件的方法笔记

Windows应用在执行过程中遇到异常等情况默认不会像linux应用那样生成dump文件&#xff0c;可以自己注册一个函数若应用存在Unhandled Exception的时候则执行写入dump文件的操作来排查某些异常情况。 生成dump文件与注册函数的代码如下&#xff1a; // 创建Dump文件 void Cr…

DUMP文件分析1:DUMP文件简介

1.1 DUMP文件类型 Windows下Dump文件分为两大类&#xff0c;内核模式Dump和用户模式Dump。内核模式Dump是操作系统创建的崩溃转储&#xff0c;最经典的就是系统蓝屏&#xff0c;这时候会自动创建内核模式的Dump。用户模式Dump进一步可以分为完整Dump&#xff08;Full Dump&…

How to enable minidumps in Java for Windows

How to enable minidumps in Java for Windows Failed to write core dump. Minidumps are not enabled by default on client versions of Windows 错误信息 # A fatal error has been detected by the Java Runtime Environment: # # EXCEPTION_ACCESS_VIOLATION (0xc000…

Effective minidump (下)

Effective minidump (下) 前半部分 (http://blog.csdn.net/pkrobbie/article/details/6636310) MiniDumpCallback函数 如果MINIDUMP_TYPE不能满足我们定制minidump内容的需要&#xff0c;我们可以使用MiniDumpCallback函数。这是一个用户定义的回调函数&#xff0c;MiniDumpW…

Effective minidump (上)

Effective minidump (上) 原文更新: 07.02.2005 翻译&#xff1a;2011/7/16 目录 简介Minidump 类型MiniDumpCallback函数用户数据流Dump类型其他例子程序 简介 在过去几年里&#xff0c;崩溃转储(crash dump)成为了调试工作的一个重要部分。如果软件在客户现场或者测试…

使用MiniDumpWriteDump API 来生成程序的Dump

MiniDumpWriteDump是MS DbgHelp.dll 中一个API, 用于导出当前运行的程序的Dump. 这个dll程序系统中就有, 但是很多软件, 都在自己的安装目录下保存了这个.dll的最新的版本. 为了测试这个API, 参考网上一些资料, 写了一个简单的C 程序. 目的是当有异常发生的时候, 自动生成Dump…

windows minidump 的那些事

在开发中最让程序员头痛的是程序异常对出。还没有留下任何蛛丝马迹。在linux系统上不用担心这个问题&#xff0c;linux内核可以完成这个工作&#xff0c;通过ulimit -c unlimited。windows也可以同windbg或dr.Watson绑定运行&#xff0c;当出现异常时会挂住进程。这样做是很多程…