开发者社区 问答 正文

java特殊字符的问题?报错

项目中遇到了一些特殊字符需要插入数据库

大概是这样的

这个字段在项目中是昵称的意思,需要排序

直接插入数据库会报错,并且特殊字符在后台接收后显示成的是方块

试过用StringEscapeUtils.escapeJava(param)转换后是可以插入数据库的,但是他是将所有字符都转成\u594B\u6597\u7684\u4FCA\u54E5\uD83D\uDE97\uD83D\uDCA8这种了。在排序的时候就出现了乱排序的现象,并且这个字符串中是带u的,这样搜索u就肯定会搜索出来

问下该如何处理这种问题?有没有什么好的办法可以插入数据库,并且实现排序功能

展开
收起
爱吃鱼的程序员 2020-06-10 14:14:30 755 分享 版权
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    这个东东叫:emoji


    1. 首先你System.out.println出来,确认一下在控制台能正常显示.证明从前台到后台是没有乱码的
    2. 确认JDBC版本,在网上查下,高于某个版本以后,才支持emoji
    3. 将mysql表以及字段默认charset设置为utf8mb4,这个也是需要高版本MySql的支持.
    emoji  unicode编码

    如果你希望让你的网站或者App支持Emoji,那么在初次设置MySQL时,有一些细节你需要知道。

    Emoji

    Emoji字符的特殊之处是,在存储时,需要用到4个字节。而MySQL中常见的utf8字符集的utf8_general_ci 这个collate最大只支持3个字节。所以为了能够存储Emoji,你需要改用 utf8mb4 字符集。

    在创建表时,用类似这样的语句:

      
       CREATE
       
        TABLE
        
         `
         tbl
         
          `
          (...)
          ENGINE
          
           =
           InnoDB
           
            DEFAULT
            CHARSET
            
             =
             utf8mb4
             
              COLLATE
              utf8mb4_general_ci
              ;
             
            
           
          
         
        
       
      
    http://www.v2ex.com/t/137724copy这里的

    如果不想保留emoji,或者搞不定了不得不舍弃,可以用如下代码过滤:

    importorg.apache.commons.lang3.StringUtils;publicclassEmojiFilterUtils{/***将emoji表情替换成***@paramsource*@return过滤后的字符串*/publicstaticStringfilterEmoji(Stringsource){if(StringUtils.isNotBlank(source)){returnsource.replaceAll("[\\ud800\\udc00-\\udbff\\udfff\\ud800-\\udfff]","*");}else{returnsource;}}publicstaticvoidmain(String[]arg){try{Stringtext="Thisisasmiley\uD83C\uDFA6face\uD860\uDD5D\uD860\uDE07\uD860\uDEE2\uD863\uDCCA\uD863\uDCCD\uD863\uDCD2\uD867\uDD98";System.out.println(text);System.out.println(text.length());System.out.println(text.replaceAll("[\\ud83c\\udc00-\\ud83c\\udfff]|[\\ud83d\\udc00-\\ud83d\\udfff]|[\\u2600-\\u27ff]","*"));System.out.println(filterEmoji(text));}catch(Exceptionex){ex.printStackTrace();}}}



    2020-06-10 14:14:46
    赞同 展开评论