问题描述:客户调用我们的接口报错:
### Cause: java.sql.SQLException: Incorrect string value: '\xF0\x9F\x8F\x80 $...' for column 'content' at row 1
; uncategorized SQLException for SQL []; SQL state [HY000]; error code [1366]; Incorrect string value: '\xF0\x9F\x8F\x80 $...' for column 'content'
发现是Emoji表情符编码保存问题。
解决方案:
1. 数据存储(MySQL varchar 数据类型对UTF8 支持问题)
MYSQL 5.5 之前, UTF8 编码只支持1-3个字节, 从MYSQL5.5开始,可支持4个字节UTF编码,但要特殊标记。
表:
create table ttt(id int not null ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
字段:
ALTER TABLE tt2 MODIFY COLUMN `user_name` VARCHAR(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '用户名';
参考: http://www.tuicool.com/articles/zAnEV3
这篇文章介绍了怎么修改编码为utf8mb4,
How to support full Unicode in MySQL databases
https://mathiasbynens.be/notes/mysql-utf8mb4
2. 过滤或者转义保存
过滤代码:
import org.apache.commons.lang.StringUtils; import java.net.URLEncoder; /** * emoji表情字符检查与过滤工具 */ public class EmojiFilter { public static void main(String[] args) throws Exception { byte[] testbytes = {105,111,115,-30,-102,-67,32,36,-18,-128,-104,32,36,-16,-97,-113,-128,32,36,-18,-112,-86}; String tmpstr = new String(testbytes,"utf-8"); // System.out.println(URLEncoder.encode(tmpstr, "utf-8")); System.out.println(filterEmoji(tmpstr)); // System.out.println("containsEmoji2: " + containsEmoji("tetete11什么66789@#¥*(&*)*%")); System.out.println(containsEmoji(tmpstr)); } /** * 检测是否有emoji字符 * * @param source * @return 一旦含有就抛出 */ public static boolean containsEmoji(String source) { if (StringUtils.isBlank(source)) { return false; } int len = source.length(); for (int i = 0; i < len; i++) { char codePoint = source.charAt(i); if (!isNotEmojiCharacter(codePoint)) { //判断到了这里表明,确认有表情字符 return true; } } return false; } /** * 判断是否为非Emoji字符 * * @param codePoint 比较的单个字符 * @return */ private static boolean isNotEmojiCharacter(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 (StringUtils.isBlank(source)) { return source; } if (!containsEmoji(source)) { return source;//如果不包含,直接返回 } StringBuilder buf = new StringBuilder(); int len = source.length(); for (int i = 0; i < len; i++) { char codePoint = source.charAt(i); if (isNotEmojiCharacter(codePoint)) { buf.append(codePoint); } } return buf.toString().trim(); } }
或者另一个检查方法(参考自http://blog.csdn.net/eabiao/article/details/40653555):
import java.util.HashSet; import java.util.Set; /** * EmojiUtil * * @author abiao */ public class EmojiUtil { private static final char[] EMOJI_SOFTBANK_TABLE = { 0x21d4, 0x25b2, 0x25bc, 0x25cb, 0x25cf, 0x3013, 0xe001, 0xe002, 0xe003, 0xe004, 0xe005, 0xe006, 0xe007, 0xe008, 0xe009, 0xe00a, 0xe00b, 0xe00c, 0xe00d, 0xe00e, 0xe00f, 0xe010, 0xe011, 0xe012, 0xe013, 0xe014, 0xe015, 0xe016, 0xe017, 0xe018, 0xe019, 0xe01a, 0xe01b, 0xe01c, 0xe01d, 0xe01e, 0xe01f, 0xe020, 0xe021, 0xe022, 0xe023, 0xe024, 0xe025, 0xe026, 0xe027, 0xe028, 0xe029, 0xe02a, 0xe02b, 0xe02c, 0xe02d, 0xe02e, 0xe02f, 0xe030, 0xe031, 0xe032, 0xe033, 0xe034, 0xe035, 0xe036, 0xe037, 0xe038, 0xe039, 0xe03a, 0xe03b, 0xe03c, 0xe03d, 0xe03e, 0xe03f, 0xe040, 0xe041, 0xe042, 0xe043, 0xe044, 0xe045, 0xe046, 0xe047, 0xe048, 0xe049, 0xe04a, 0xe04b, 0xe04c, 0xe04d, 0xe04e, 0xe04f, 0xe050, 0xe051, 0xe052, 0xe053, 0xe054, 0xe055, 0xe056, 0xe057, 0xe058, 0xe059, 0xe05a, 0xe101, 0xe102, 0xe103, 0xe104, 0xe105, 0xe106, 0xe107, 0xe108, 0xe109, 0xe10a, 0xe10b, 0xe10c, 0xe10d, 0xe10e, 0xe10f, 0xe110, 0xe111, 0xe112, 0xe113, 0xe114, 0xe115, 0xe116, 0xe117, 0xe118, 0xe119, 0xe11a, 0xe11b, 0xe11c, 0xe11d, 0xe11e, 0xe11f, 0xe120, 0xe121, 0xe122, 0xe123, 0xe124, 0xe125, 0xe126, 0xe127, 0xe128, 0xe129, 0xe12a, 0xe12b, 0xe12c, 0xe12d, 0xe12e, 0xe12f, 0xe130, 0xe131, 0xe132, 0xe133, 0xe134, 0xe135, 0xe136, 0xe137, 0xe138, 0xe139, 0xe13a, 0xe13b, 0xe13c, 0xe13d, 0xe13e, 0xe13f, 0xe140, 0xe141, 0xe142, 0xe143, 0xe144, 0xe145, 0xe146, 0xe147, 0xe148, 0xe149, 0xe14a, 0xe14b, 0xe14c, 0xe14d, 0xe14e, 0xe14f, 0xe150, 0xe151, 0xe152, 0xe153, 0xe154, 0xe155, 0xe156, 0xe157, 0xe158, 0xe159, 0xe15a, 0xe201, 0xe202, 0xe203, 0xe204, 0xe205, 0xe206, 0xe207, 0xe208, 0xe209, 0xe20a, 0xe20b, 0xe20c, 0xe20d, 0xe20e, 0xe20f, 0xe210, 0xe211, 0xe212, 0xe213, 0xe214, 0xe215, 0xe216, 0xe217, 0xe218, 0xe219, 0xe21a, 0xe21b, 0xe21c, 0xe21d, 0xe21e, 0xe21f, 0xe220, 0xe221, 0xe222, 0xe223, 0xe224, 0xe225, 0xe226, 0xe227, 0xe228, 0xe229, 0xe22a, 0xe22b, 0xe22c, 0xe22d, 0xe22e, 0xe22f, 0xe230, 0xe231, 0xe232, 0xe233, 0xe234, 0xe235, 0xe236, 0xe237, 0xe238, 0xe239, 0xe23a, 0xe23b, 0xe23c, 0xe23d, 0xe23e, 0xe23f, 0xe240, 0xe241, 0xe242, 0xe243, 0xe244, 0xe245, 0xe246, 0xe247, 0xe248, 0xe249, 0xe24a, 0xe24b, 0xe24c, 0xe24d, 0xe24e, 0xe24f, 0xe250, 0xe251, 0xe252, 0xe253, 0xe301, 0xe302, 0xe303, 0xe304, 0xe305, 0xe306, 0xe307, 0xe308, 0xe309, 0xe30a, 0xe30b, 0xe30c, 0xe30d, 0xe30e, 0xe30f, 0xe310, 0xe311, 0xe312, 0xe313, 0xe314, 0xe315, 0xe316, 0xe317, 0xe318, 0xe319, 0xe31a, 0xe31b, 0xe31c, 0xe31d, 0xe31e, 0xe31f, 0xe320, 0xe321, 0xe322, 0xe323, 0xe324, 0xe325, 0xe326, 0xe327, 0xe328, 0xe329, 0xe32a, 0xe32b, 0xe32c, 0xe32d, 0xe32e, 0xe32f, 0xe330, 0xe331, 0xe332, 0xe333, 0xe334, 0xe335, 0xe336, 0xe337, 0xe338, 0xe339, 0xe33a, 0xe33b, 0xe33c, 0xe33d, 0xe33e, 0xe33f, 0xe340, 0xe341, 0xe342, 0xe343, 0xe344, 0xe345, 0xe346, 0xe347, 0xe348, 0xe349, 0xe34a, 0xe34b, 0xe34c, 0xe34d, 0xe401, 0xe402, 0xe403, 0xe404, 0xe405, 0xe406, 0xe407, 0xe408, 0xe409, 0xe40a, 0xe40b, 0xe40c, 0xe40d, 0xe40e, 0xe40f, 0xe410, 0xe411, 0xe412, 0xe413, 0xe414, 0xe415, 0xe416, 0xe417, 0xe418, 0xe419, 0xe41a, 0xe41b, 0xe41c, 0xe41d, 0xe41e, 0xe41f, 0xe420, 0xe421, 0xe422, 0xe423, 0xe424, 0xe425, 0xe426, 0xe427, 0xe428, 0xe429, 0xe42a, 0xe42b, 0xe42c, 0xe42d, 0xe42e, 0xe42f, 0xe430, 0xe431, 0xe432, 0xe433, 0xe434, 0xe435, 0xe436, 0xe437, 0xe438, 0xe439, 0xe43a, 0xe43b, 0xe43c, 0xe43d, 0xe43e, 0xe43f, 0xe440, 0xe441, 0xe442, 0xe443, 0xe444, 0xe445, 0xe446, 0xe447, 0xe448, 0xe449, 0xe44a, 0xe44b, 0xe44c, 0xe501, 0xe502, 0xe503, 0xe504, 0xe505, 0xe506, 0xe507, 0xe508, 0xe509, 0xe50b, 0xe50c, 0xe50d, 0xe50e, 0xe50f, 0xe510, 0xe511, 0xe512, 0xe513, 0xe514, 0xe515, 0xe516, 0xe517, 0xe518, 0xe519, 0xe51a, 0xe51b, 0xe51c, 0xe51d, 0xe51e, 0xe51f, 0xe520, 0xe521, 0xe522, 0xe523, 0xe524, 0xe525, 0xe526, 0xe527, 0xe528, 0xe529, 0xe52a, 0xe52b, 0xe52c, 0xe52d, 0xe52e, 0xe52f, 0xe530, 0xe531, 0xe532, 0xe533, 0xe534, 0xe535, 0xe536, 0xe537, 0xff5e, 0xffe5 }; private static final Set<Character> EMOJI_SET = new HashSet<Character>(); static { for (int i = 0; i < EMOJI_SOFTBANK_TABLE.length; i++) { EMOJI_SET.add(EMOJI_SOFTBANK_TABLE[i]); } } public static boolean isEmoji(char c) { return EMOJI_SET.contains(c); } public static boolean containsEmoji(String s) { for (int i = 0; i < s.length(); i++) { if (isEmoji(s.charAt(i))) { return true; } } return false; } }
转义代码:
import com.sun.org.apache.xml.internal.security.utils.Base64; import org.apache.commons.lang.StringEscapeUtils; import java.io.UnsupportedEncodingException; public class EmojiHandler { public static void main(String[] args) throws Exception { byte[] testbytes = {105,111,115,-30,-102,-67,32,36,-18,-128,-104,32,36,-16,-97,-113,-128,32,36,-18,-112,-86}; String tmpstr = new String(testbytes,"utf-8"); System.out.println(tmpstr); String encoded = encodeJava(tmpstr); System.out.println(encoded); System.out.println(decodeJava(encoded)); } public static String decodeJava(String text) { return StringEscapeUtils.unescapeJava(text); } public static String encodeJava(String text) { return StringEscapeUtils.escapeJava(text); } public String decodeHtml(String emoji) { return StringEscapeUtils.unescapeHtml(emoji); } public String encodeHtml(String emoji) { return StringEscapeUtils.escapeHtml(emoji); } public String base64Encode(String text) { try { byte[] data = text.getBytes("UTF-8"); return Base64.encode(data); } catch (UnsupportedEncodingException e) { return text; } } public String base64Decode(String text) { try { byte[] data = Base64.decode(text); return new String(data, "UTF-8"); } catch (Exception e) { return text; } } public String encodeToUNICODE(String text) { String encoding = "UNICODE"; try { byte[] bytes = (text).getBytes(); return new String(bytes, encoding); } catch (UnsupportedEncodingException e) { return text; } } public String encodeToUSASCII(String text) { String encoding = "US-ASCII"; try { byte[] bytes = (text).getBytes(); return new String(bytes, encoding); } catch (UnsupportedEncodingException e) { return text; } } public String encodeToUTF8(String text) { String encoding = "UTF-8"; try { byte[] bytes = (text).getBytes(); return new String(bytes, encoding); } catch (UnsupportedEncodingException e) { return text; } } public String encodeToUTF16(String text) { String encoding = "UTF-16"; try { byte[] bytes = (text).getBytes(); return new String(bytes, encoding); } catch (UnsupportedEncodingException e) { return text; } } public static String toUnicode(char c) { return String.format("\\u%04x", (int) c); } }
参考:
https://github.com/Will5/EMOJITextView
https://github.com/Will5/EMOJITextView/blob/master/EMOJITextView/src/may/will/emojitextview/EmojiHandler.java
http://stackoverflow.com/questions/27334975/how-to-replace-emoji-in-android-softkeyboard
Emoji表情符号兼容方案 http://blog.csdn.net/qdkfriend/article/details/7576524
相关推荐
总的来说,处理emoji表情与Oracle数据库的交互是一项技术挑战,需要结合Java的字符串处理能力和第三方库。通过解析和转换emoji,我们可以克服Oracle数据库的限制,使表情在移动端得以正常显示。在实际项目中,务必...
Java Emoji Converter是一个实用的工具,专门用于处理和转换在不同平台和客户端之间可能出现的Emoji编码不兼容问题。在现代通信中,Emoji已经成为一种普遍的表达方式,但它们在不同的操作系统、浏览器或应用程序中的...
判断字符串是否包含emoji表情
本项目是一个基于Java的Emoji表情处理工具,旨在提供一套完整的解决方案来处理和转换Emoji表情。项目包含了Emoji表情的加载、存储、转换、替换和删除等功能,适用于需要处理Emoji表情的各种应用场景。 ## 项目的...
总的来说,禁止EditText输入Emoji表情符主要涉及到字符的Unicode检测、监听输入事件以及可能的正则匹配。在实际开发中,可以根据项目需求和性能考虑选择合适的方法。同时,也要注意,禁用Emoji输入可能会降低用户...
1. 去掉emoji表情符: 这种方法是在Java代码中处理,通过编写一个名为`EmojiFilter`的类,该类可以过滤掉输入字符串中的emoji表情。在实际应用中,你可以调用`EmojiFilter.filterEmoji("昵称")`来移除包含的emoji...
在Java开发过程中,处理Unicode表情符号(Emoji)可能是一项挑战,因为并非所有Java API都原生支持它们。这时,第三方库如"emoji-java"就显得非常有用。这个库由vdurmont开发,专为Java提供了方便的方式来解析、验证...
Java emoji表情存储解决方法 Java 中 emoji 表情存储的解决方法是指在 Java 应用程序中处理和存储 emoji 表情数据的方法。随着社交媒体和即时通信应用程序的普及,emoji 表情变得越来越流行,然而在 Java 应用程序...
因此,在设计与无线互联网相关的MySQL数据库时,推荐采用UTF-8mb4字符集来确保能够妥善处理emoji表情符号,避免出现数据存储或显示上的问题。 #### 限制 使用UTF-8mb4字符集的前提条件包括: - MySQL服务器版本需...
java处理数据库不支持的emoji表情符问题解决 在当今社会中,emoji表情符已经成为我们日常生活中的一个重要组成部分。然而,在数据库中存储emoji表情符时,却可能会出现一些问题。主要是因为大多数数据库的编码是utf...
总结,限制`EditText`输入Emoji表情符主要通过自定义`InputFilter`实现,通过检查输入字符的Unicode属性或者借助第三方库进行判断过滤。这有助于保持应用的数据一致性,避免因不期望的字符输入导致的问题。在实际...
在Android应用开发中,添加emoji表情功能已经成为许多社交和通讯应用的标准配置,因为它们能有效增强用户表达情感的方式。本文将详细介绍如何在Android项目中实现一个简单的emoji表情功能,包括如何展示和发送emoji...
在Android开发中,引入和展示Emoji表情已经成为许多社交应用的标准功能。这主要涉及到自定义TextView以支持Unicode编码的表情字符,并确保它们在输入框中正确显示。以下是对这一主题的详细阐述。 首先,我们需要...
Java Emoji Converter(Emoji表情转换工具) Emoji转换工具,适合各种规格客户端生成的Emoji字符串转换成另外一种格式。 一种在每种类型之间转换表情符号字符串的工具,例如软银行表情符号,unicode表情符号,别名...
通用的正则检测工具类,包含用户名 手机号 等 支持检测限制emoji字符表情
在Java编程中,处理Unicode表情(emoji)可能会遇到一些挑战,因为传统的字符串处理方法可能无法正确地识别和处理这些特殊字符。本项目提供了一个关于如何在Java中有效地处理emoji的实例,这对于现代应用程序,尤其...
在聊天应用中,正确显示emoji表情对于提升用户体验至关重要。本资源"聊天emoji表情显示"聚焦于如何在不同平台和环境中实现emoji的完美展示。 首先,我们要了解emoji的编码标准。Unicode是全球字符编码的统一标准,...
在IT行业中,尤其是在Java开发领域,处理Unicode字符集中的特殊字符,如Emoji表情符号,是一项常见但有时也具有挑战性的任务。"emoji-java-master"项目就是针对这个问题提供的一种解决方案,它是一个专门用于处理和...
综上所述,`And安卓Emoji表情TextView`涉及到了Unicode编码、字体设置、第三方库的使用、字符串处理以及性能优化等多个方面。开发者在实现这一功能时,需要充分理解这些知识点,并根据项目需求进行合理选择和优化。
为了解决这个问题,需要将Mysql的编码升级到UTF8MB4,这样可以正确地存储和显示emoji表情符号。 升级编码的步骤 1. 在Connector/J的连接参数中,不要加characterEncoding参数。这是因为characterEncoding参数可能...