微信表情过滤 java "java.sql.SQLException: Incorrect string value: '\"

iOS 5.0之前,苹果都是采用3个字节来承接emoji表情,Java的普通char可以支持显示。但iOS 5.0之后, 苹果升级了系统自带的emoji表情输入法,用的Unicode 6标准来统一,是采用4个bytes来承接一个 emoji表情。如果不做处理的话,这种表情直接存储到mysql5.5以下的数据库是会报错的。
就像这两个表情一样:, 在Windows 8以下估计都不支持显示,可能会显示成框框,可能压根就是空白, 你可以在Mac中使用Safari浏览器中,就可以看到。经过测试,在Mac就算用Chrome浏览器(Version 25.0.1364.172)也是不行的。
iOS5.0 Emoji表情示例
这种数据在Mysql 5.5之前,UTF-8支持1-3个字节的编码,从Mysql5.5开始后,可以支持4个字节的UTF编码,但要特殊标记。修改 Mysql相应存储字段为utf8mb4。修改语句如下

sql:

ALTER TABLE table_name
MODIFY COLUMN content varchar(500) CHARACTER
SET utf8mb4 COLLATE utf8mb4_unicode_ci
DEFAULT NULL COMMENT ‘content of message‘;

 

在某种业务情景下,我们可以选择过滤掉这种“非法”的字符。我采用的方式是,在字符上面做操作,下面是Java示例代码,核心的代码附上,应该是 无法直接下载就能够编译,你得小小的做一些微调,没有额外的依赖:

 

iOS 5.0之前,苹果都是采用3个字节来承接emoji表情,Java的普通char可以支持显示。但iOS 5.0之后, 苹果升级了系统自带的emoji表情输入法,用的Unicode 6标准来统一,是采用4个bytes来承接一个 emoji表情。如果不做处理的话,这种表情直接存储到mysql5.5以下的数据库是会报错的。
就像这两个表情一样:, 在Windows 8以下估计都不支持显示,可能会显示成框框,可能压根就是空白, 你可以在Mac中使用Safari浏览器中,就可以看到。经过测试,在Mac就算用Chrome浏览器(Version 25.0.1364.172)也是不行的。
iOS5.0 Emoji表情示例
这种数据在Mysql 5.5之前,UTF-8支持1-3个字节的编码,从Mysql5.5开始后,可以支持4个字节的UTF编码,但要特殊标记。修改 Mysql相应存储字段为utf8mb4。修改语句如下:

SQL代码
  1. ALTERTABLE table_name
  2. MODIFYCOLUMN content varchar(500) CHARACTER
  3. SET utf8mb4 COLLATE utf8mb4_unicode_ci
  4. DEFAULTNULL COMMENT ‘content of message‘;

在某种业务情景下,我们可以选择过滤掉这种“非法”的字符。我采用的方式是,在字符上面做操作,下面是Java示例代码,核心的代码附上,应该是 无法直接下载就能够编译,你得小小的做一些微调,没有额外的依赖:

Java代码
  1.   publicclass EmojiFilter {
  2.   
  3.   /**
  4.   * 检测是否有emoji字符
  5.   * @param source
  6.   * @return 一旦含有就抛出
  7.   */
  8.   publicstaticboolean containsEmoji(String source) {
  9.   if (StringUtils.isBlank(source)) {
  10.   returnfalse;
  11.   }
  12.   
  13.   int len = source.length();
  14.   
  15.   for (int i = 0; i < len; i++) {
  16.   char codePoint = source.charAt(i);
  17.   
  18.   if (isEmojiCharacter(codePoint)) {
  19.   //do nothing,判断到了这里表明,确认有表情字符
  20.   returntrue;
  21.   }
  22.   }
  23.   
  24.   returnfalse;
  25.   }
  26.   
  27.   privatestaticboolean isEmojiCharacter(char codePoint) {
  28.   return (codePoint == 0x0) ||
  29.   (codePoint == 0x9) ||
  30.   (codePoint == 0xA) ||
  31.   (codePoint == 0xD) ||
  32.   ((codePoint >= 0x20) && (codePoint < = 0xD7FF)) ||
  33.   ((codePoint >= 0xE000) && (codePoint < = 0xFFFD)) ||
  34.   ((codePoint >= 0x10000) && (codePoint < = 0x10FFFF));
  35.   }
  36.   
  37.   /**
  38.   * 过滤emoji 或者 其他非文字类型的字符
  39.   * @param source
  40.   * @return
  41.   */
  42.   publicstatic String filterEmoji(String source) {
  43.   
  44.   if (!containsEmoji(source)) {
  45.   return source;//如果不包含,直接返回
  46.   }
  47.   //到这里铁定包含
  48.   StringBuilder buf = null;
  49.   
  50.   int len = source.length();
  51.   
  52.   for (int i = 0; i < len; i++) {
  53.   char codePoint = source.charAt(i);
  54.   
  55.   if (isEmojiCharacter(codePoint)) {
  56.   if (buf == null) {
  57.   buf = new StringBuilder(source.length());
  58.   }
  59.   
  60.   buf.append(codePoint);
  61.   } else {
  62.   }
  63.   }
  64.   
  65.   if (buf == null) {
  66.   return source;//如果没有找到 emoji表情,则返回源字符串
  67.   } else {
  68.   if (buf.length() == len) {//这里的意义在于尽可能少的toString,因为会重新生成字符串
  69.   buf = null;
  70.   return source;
  71.   } else {
  72.   return buf.toString();
  73.   }
  74.   }
  75.   
  76.   }
  77.   }
  78.   

SAE的数据库也不支持EMOJI表情  引用 :http://cloudbbs.org/forum.php?mod=viewthread&tid=23209

微信表情过滤 java "java.sql.SQLException: Incorrect string value: '\"

上一篇:微信js获得签名signature


下一篇:微信朋友圈举报功能来了 这回可以清静了吗?