首先,看一下unicode10中的新版emoji表情包(連接),一共有1600+款表情,html
通過分析,新增長的表情基本都是兩個或者更多unicode碼,因而將以上表情包中的html文件下載下來進行解析,並輸出成java的map,代碼基本格式以下java
map.put("😀", "U+1F600"); map.put("😁", "U+1F601"); map.put("😂", "U+1F602"); map.put("😃", "U+1F603"); map.put("😄", "U+1F604"); map.put("😅", "U+1F605"); map.put("😆", "U+1F606");
通過對錶情的unicode進行不一樣編碼格式的分析,發現兩個unicode以上的表情的16進制基本都是以/F0開頭,決定拿這些開刀
app
/** * 字符串轉換成十六進制字符串 * @param String str 待轉換的ASCII字符串 * @return String 每一個Byte之間/分隔,如: [/61/6C/6B] */ public static String str2HexStr(String str) { char[] chars = "0123456789ABCDEF".toCharArray(); StringBuilder sb = new StringBuilder(""); byte[] bs = str.getBytes(); int bit; for (int i = 0; i < bs.length; i++) { sb.append('/'); bit = (bs[i] & 0x0f0) >> 4; sb.append(chars[bit]); bit = bs[i] & 0x0f; sb.append(chars[bit]); } return sb.toString().trim(); }
將其轉化成字符串以後
ui
while(resultStr.indexOf("/F0") != -1){ resultStr = resultStr.replace(resultStr.substring(resultStr.indexOf("/F0"), resultStr.indexOf("/F0") + 12), "/3F"); } resultStr = resultStr.replace("/", ""); System.out.println(resultStr);
將/F0後面的四個16進制的轉化成/3F,即「?」;編碼
而後再講替換以後的16進制字符串轉化成正常的字符串spa
/** * 十六進制轉換字符串 * @param String str Byte字符串(Byte之間無分隔符 如:[616C6B]) * @return String 對應的字符串 */ public static String hexStr2Str(String hexStr) { String str = "0123456789ABCDEF"; char[] hexs = hexStr.toCharArray(); byte[] bytes = new byte[hexStr.length() / 2]; int n; for (int i = 0; i < bytes.length; i++) { n = str.indexOf(hexs[2 * i]) * 16; n += str.indexOf(hexs[2 * i + 1]); bytes[i] = (byte) (n & 0xff); } return new String(bytes); }
運行結果以下圖.net
code下載地址:http://download.csdn.net/detail/pan_shuyang/9465438code