emoji表情特殊字符出错处理

问题描述

第三方登录时,微信昵称QQ昵称包含表情符或特殊字符,存储到mysql数据库时,会报错。


解决方案如下

第一,修改数据库字符集: 

这种方法需要的硬性要求就是你的mysql数据库版本5.5以后的。一般有数据库管理工具的,直接打开改了就是了,比如我用的Navicat for MySQL,直接把表改为utf8mb4 -- UTF-8 Unicode就可以了。这种方法简单省事,但是可能需要重启数据库。还有个问题是,有时候这方法不太灵。

第二,将这些表情过滤掉 
既然数据库不能保存,那就直接把这些表情过滤掉好了。这种情况是损坏客户的个性而让服务更便捷的一张方式。目前很多网站就是这么处理的,毕竟效率是关键,你这表情即便保存了,也说不定哪里再次用到,展示不了。所以还是过滤emoji字符吧。


过滤工具类简单DEMO

  1. package com.util;
  2. import org.apache.commons.lang.StringUtils;
  3. public class SLEmojiFilter {
  4. /**
  5. * 检测是否有emoji字符
  6. *
  7. * @param source
  8. * @return 一旦含有就抛出
  9. */
  10. public static boolean containsEmoji(String source) {
  11. if (StringUtils.isBlank(source)) {
  12. return false;
  13. }
  14. int len = source.length();
  15. for ( int i = 0; i < len; i++) {
  16. char codePoint = source.charAt(i);
  17. if (isEmojiCharacter(codePoint)) {
  18. // do nothing,判断到了这里表明,确认有表情字符
  19. return true;
  20. }
  21. }
  22. return false;
  23. }
  24. private static boolean isEmojiCharacter(char codePoint) {
  25. return (codePoint == 0x0) || (codePoint == 0x9) || (codePoint == 0xA) || (codePoint == 0xD)
  26. || ((codePoint >= 0x20) && (codePoint <= 0xD7FF)) || ((codePoint >= 0xE000) && (codePoint <= 0xFFFD))
  27. || ((codePoint >= 0x10000) && (codePoint <= 0x10FFFF));
  28. }
  29. /**
  30. * 过滤emoji 或者 其他非文字类型的字符
  31. *
  32. * @param source
  33. * @return
  34. */
  35. public static String filterEmoji(String source) {
  36. source = source.replaceAll( "[\\ud800\\udc00-\\udbff\\udfff\\ud800-\\udfff]", "*");
  37. if (!containsEmoji(source)) {
  38. return source; // 如果不包含,直接返回
  39. }
  40. // 到这里铁定包含
  41. StringBuilder buf = null;
  42. int len = source.length();
  43. for ( int i = 0; i < len; i++) {
  44. char codePoint = source.charAt(i);
  45. if (isEmojiCharacter(codePoint)) {
  46. if (buf == null) {
  47. buf = new StringBuilder(source.length());
  48. }
  49. buf.append(codePoint);
  50. } else {
  51. buf.append( "*");
  52. }
  53. }
  54. if (buf == null) {
  55. return source; // 如果没有找到 emoji表情,则返回源字符串
  56. } else {
  57. if (buf.length() == len) { // 这里的意义在于尽可能少的toString,因为会重新生成字符串
  58. buf = null;
  59. return source;
  60. } else {
  61. return buf.toString();
  62. }
  63. }
  64. }
  65. }


https://blog.csdn.net/zuozhiyoulaisam/article/details/53467351

猜你喜欢

转载自blog.csdn.net/m0_37477061/article/details/80881790