手机输入法emoji、颜文字存储

很多移动端手机输入法都带有emoji和颜文字,丰富了用户表达,但也苦逼了我们。我们做的是一个移动App,可以与相互文字交流。前端用的是HTML5。。。。那一套。发现这一套对表情包的显示没啥毛病,以为解决表情包十分简单。哎呀。。上了输入发的当。。。数据发送到后台,然后存储在转发回来。。崩溃老,乱编。一两天的百度,发现好多网友提供的都是编码编码解决。因为表情包用的是unicode的编码,我们后台是utf-8。先说明一下,后台是用java  struts2 tomcat这一套。。表情包中的emoji很好解决,找到了编码表,网友们也提供了编码方法。这些编码的方法的特点是将unicode遍成后台可识别的字符串如“&#。。。。”,如果只是emoji可以用这一种方法。

网友提供的方法

function utf16toEntities(str) { 
    var patt=/[\ud800-\udbff][\udc00-\udfff]/g; // 检测utf16字符正则 
    str = str.replace(patt, function(char){ 
            var H, L, code; 
            if (char.length===2) { 
                H = char.charCodeAt(0); // 取出高位 
                L = char.charCodeAt(1); // 取出低位 
                code = (H - 0xD800) * 0x400 + 0x10000 + L - 0xDC00; // 转换算法 
                return "&#" + code + ";"; 
            } else { 
                return char; 
            } 
        }); 
    return str; 
}

但特别提醒一下,该方法是针对32位unicode编码设计,有部分是emoji是16位编码的,找去来,弄个表检索就好。

弄出emoji以为就结束老,颜文字呀!颜文字是用多种语言拼和起的,苦逼老吧,还是要解决unicode存储的问题。数据库用的SqlSever,又痛苦老,找不到unicode....。找到unicode又怎样!看看这些。。。

struts2 已被设置

web 已被设置

html 已被设置

手机输入法emoji、颜文字存储_第1张图片

还有汤姆猫,你改,你想翻天吗?

纠结了几天,想了各种方法,自己设计编码,解码。。。然而,js不能对内存进行操作。。都是白忙活。

山重水复疑无路,柳暗花明又一村。。。

解决的办法尽是如此简单。。

其实问题就出在存储上。。。

你要明白一点是java String也是用的unicode,网页也是用的unicode。。只是数据存储这里和给我们显示出来的时候是utf-8,其实内存中它存储的还是页面传输的原始数据,只要我们存储这个原始数据岂不是大功告成。。。

我用的SQLSever2012 测试成功。。

sql 中 varchar =>byte[]  我们获取到String的unicode编码数组,将其存入即可,读出来的时候在将数组以unicode编码写入String。

存。。。

String sql="INSERT INTO [ComRecode] (datetime,groupid,words,userid) VALUES(?,?,?,?)";
  try {
   PreparedStatement pre=connection.prepareStatement(sql);
   byte buf[]=null;
   buf=r.getWords().getBytes("UnicodeBigUnmarked"); //就这里比较关键
 
   pre.setString(1, r.getDatetime());
   pre.setInt(2, r.getGroupid());
   pre.setBytes(3, buf);
   pre.setString(4, r.getPhone());
   
   pre.executeUpdate();
   pre.clearParameters();
   //pre.setBytes(parameterIndex, x);
  } catch (SQLException | UnsupportedEncodingException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
   return false;
  }

取。。。。

ResultSet re=state.executeQuery(sql);
   while(re.next())
   {
    Record r=new Record();
    r.setDatetime(ToolTime.df2.format(new Date(re.getTimestamp(1).getTime()))); //就这里关键
    r.setWords(new String(re.getBytes(2),"UnicodeBigUnmarked"));
    r.setPhone(re.getString(3));
    r.setGroupid(groupid);
    recodes.add(r);
   }

其他的模式都没改。。还是一样的用struts2的action,用json..其他一点不动。

结果:

手机输入法emoji、颜文字存储_第2张图片

当然。。。数据库你们将看到很多乱码,这个就无所谓老

进过一天的测试补一点。。。存储字节码的时候发现最后一个是大于0x7f无法存入,你们可以试试最后一个是‘的’的情况。。如果是乱码,可能和我遇到老同样的问题,解决办法就是末尾插入读出去掉一个小于0x080的数。。



你可能感兴趣的:(经验)