• 需要存储从公众号进入我们商城的用户的微信昵称,由于Android和ios系统中存在emoji这种特殊字符,导致我从微信接口中获取到的微信昵称中如果含有emoji字符,插入数据库就会报错(mysql数据库)。 报错信息:...

    最近在做一个基于微信公众号开发的微店商城项目,本人是java后台。需要存储从公众号进入我们商城的用户的微信昵称,由于Android和ios系统中存在emoji这种特殊字符,导致我从微信接口中获取到的微信昵称中如果含有emoji字符,插入数据库就会报错(mysql数据库)。

    报错信息:Incorrect string value: '\xF0\x9F\xA4\x97 3...' for column 'nick_name' at row 1

    百度了解知道:emoji表情符采用Unicode 6标准,采用4个byte字节存储一个emoji表情符,而我们的mysql数据库采用UTF-8编码格式时,采用3个byte字节存储一个字符,这样插入数据库就会报错。好在mysql5.5.3之后新增了一个utf8mb4字符集,专门用来兼容4字节的Unicode字符。

    解决办法:
    一、如果非得存储emoji表情。mysql5.5.3以下的升级数据库,本来就是5.5以上的直接修改字符集和排序规则,注意一定要同时把排序规则也一起修改了。
    1.修改数据的字符集和排序规则,如下图:
    2.修改表中该字段的字符集和排序规则
    3.重启数据库,再次插入就不会报错。emoji在数据库中还是无法正常显示。

    、直接将emoji表情过滤,我还是觉得这种办法方便,毕竟重装数据库对业务有很大的影响,特别是该数据库中有别的线上项目的数据时根本不允许重装。
    /**
    * @Title:emoji特殊处理
    * @author:yanbing
    * @date:2017-12-05 10:15
     */
    public class EmojiStringUtils {
    	/**
    	* @Title:判断是否存在特殊字符串
    	* @param
    	* @author:yanbing
    	* @date:2017-12-05 10:14
    	 */
        public static boolean hasEmoji(String content){
            Pattern pattern = Pattern.compile("[\ud83c\udc00-\ud83c\udfff]|[\ud83d\udc00-\ud83d\udfff]|[\u2600-\u27ff]");
            Matcher matcher = pattern.matcher(content);
            if(matcher .find()){
                return true;    
            }
                return false;
        }
        /**
        * @Title:替换字符串中的emoji字符
        * @param
        * @author:yanbing
        * @date:2017-12-05 10:17
         */
        public static String replaceEmoji(String str){
        	if(!hasEmoji(str)){
        		return str;
        	}else{
        		str=str.replaceAll("[\ud83c\udc00-\ud83c\udfff]|[\ud83d\udc00-\ud83d\udfff]|[\u2600-\u27ff]", " ");
        		return str;
        	}
        	
        }
    }


    附注:emoji表情符的编码表:http://punchdrunker.github.io/iOSEmoji/table_html/flower.html2017

    2017/12/6 14:17后记:

    本人在升级数据库后(mysql5.6),按照上述方法一操作,发现还是无法插入带有emoji标签的字符,检查我的数据库字符集发现:

    执行:SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';

    出现:

    character_set_client utf8
    character_set_connection utf8
    character_set_database utf8mb4
    character_set_filesystem binary
    character_set_results utf8
    character_set_server latin1
    character_set_system utf8
    collation_connection utf8_general_ci
    collation_database utf8mb4_general_ci
    collation_server latin1_swedish_ci
    发现character_set_server=latin1,百度知道latin1是ISO-8859-1的别名,也就是说安装数据库是选择的字符集是ISO-8859-1,导致我们新建数据库时服务器字符集 (character_set_server)默认为iso-8859-1,解决方法:

    Linux版本的mysql安装后一般会有一个my.cnf文件,在etc目录下,cd /etc进入my.cnf目录,vim my.cnf进入编辑模式,在[mysqld]下面增加两行配置:character_set_server=utf8mb4  collation_server=utf8mb4_general_ci

    重启数据库:service mysqld restart;

    再次查询所有字符集都是utf8编码的,插入数据也成功
    character_set_client utf8
    character_set_connection utf8
    character_set_database utf8mb4
    character_set_filesystem binary
    character_set_results utf8
    character_set_server utf8mb4
    character_set_system utf8
    collation_connection utf8_general_ci
    collation_database utf8mb4_general_ci
    collation_server utf8mb4_general_ci



    展开全文
  • 一、 preg_match('/[\x{4e00}-\x{9fa5}A-Za-z0-9_]+/u', $userInfo['nickname'],$matches) $userInfo['nickname'] = ...注:这种方式会去掉昵称中的图片保留剩下的 二、 base64_encode(编码) base64_decode(...

    一、

    preg_match('/[\x{4e00}-\x{9fa5}A-Za-z0-9_]+/u', $userInfo['nickname'],$matches) 

    $userInfo['nickname'] = implode('',$matches);

    注:这种方式会去掉昵称中的图片保留剩下的

    二、

       base64_encode(编码)

    base64_decode(解码)
    注:存入数据库时编码,读取时解码(完美解决)

    转载于:https://www.cnblogs.com/blange/p/11387128.html

    展开全文
  • 我们在做微信开发的时候,有一个很重要的就是通过openid获取用户的详细信息,包含昵称,头像,省,市,区的信息,但是现在移动时代,很多人追求个性,在名字当中大量使用火星文或者表情符。这给微信开发带来了一些...

    我们在做微信开发的时候,有一个很重要的就是通过openid获取用户的详细信息,包含昵称,头像,省,市,区的信息,但是现在移动时代,很多人追求个性,在名字当中大量使用火星文或者表情符。这给微信开发带来了一些问题,我们在获取昵称之后保存到mysql数据库当中去就会出现错误。

    解决办法:
    把nickname查出来,然后对nickname进行编码,编码完成之后保存到数据库当中。这样做的好处是不会损失细节,方便操作,只需要对数据进行一行代码的编码,坏处是直接用navicat打开表的时候nickname就看不懂了,并且在用到nickname的时候一定要记得先进行解码。
    String  nickname=userInfo.getAsJsonObject().get("nickname").getAsString();
    try {
        //进行编码
        nickname =  Base64.encodeBase64String(nickname.getBytes("UTF-8"));
    } catch (UnsupportedEncodingException  e) {
        e.printStackTrace();
    }
    user.setNickname(nickname);
    String nickname = (String) map.get("nickname");
    try {
        //进行解码
        nickname = new  String(Base64.decodeBase64(nickname), "UTF-8");
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }
    map.put("nickname", nickname);

     

    转载于:https://www.cnblogs.com/jiefu/p/11008970.html

    展开全文
  • 我们在做微信开发的时候,有一个很重要的就是通过openid获取用户的详细信息,包含昵称,头像,省,市,区的信息,但是现在移动时代,很多人追求个性,在名字当中大量使用火星文或者表情符。(本人实际测试过一个20w+...

    我们在做微信开发的时候,有一个很重要的就是通过openid获取用户的详细信息,包含昵称,头像,省,市,区的信息,但是现在移动时代,很多人追求个性,在名字当中大量使用火星文或者表情符。(本人实际测试过一个20w+用户的公众号,昵称,省市区的信息都有可能包含特殊字符,暂时不了解为什么省市区都出现特殊字符的情况)这给微信开发带来了一些问题,我们在获取昵称之后保存到mysql数据库当中去就会出现错误。

    下面三种解决办法:

    1.取到了用户的昵称,把含有特殊字符的信息过滤掉然后进保存,好处是简单,坏处是会损失昵称细节,在非常不严格的情况下,才能够使用。

    nickname.replaceAll("[\ue000-\uefff]","");

    2.对mysql进行特殊设置,好处是你设置了好了之后可以一劳永逸的解决问题,坏处是可能会影响mysql的性能,并且假如你的数据库,表已经建立好,修改起来比较麻烦。

    第一步:找到你的mysql的配置文件,一般叫my.cnf,打开之后全局搜索 character 关键词,可以搜索出很包含这个字符的信息,这个是设置字符编码的,让他们的值都等于utf8mb4,例如:default-character-set=utf8mb4。

    第二步:修改表列的字符集,把你现有表的字符集全部改为utf8mb4编码。

    第三步:JDBC数据库连接

    jdbc:mysql://localhost:3306/mediamall?useSSL=false&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true

    3.也是我现在采用的方法,就是把nickname查出来,然后对nickname进行编码,编码完成之后保存到数据库当中。这样做的好处是不会损失细节,方便操作,只需要对数据进行一行代码的编码,坏处是直接用navicat打开表的时候nickname就看不懂了,并且在用到nickname的时候一定要记得先进行解码。

     import org.apache.commons.codec.binary.Base64;
     String nickname = jsonObject.getString("nickname");//jsonObject对象是查询出来的用户信息转化为json对象,用的是阿里巴巴的fastjson
     //进行编码
     nickname =Base64.encodeBase64String(nickname.getBytes("UTF-8"));
     //进行解码
     nickname = new String(Base64.decodeBase64(nickname),"UTF-8");

    假如数据需要在HTML页面进行Base64编码和解码,可以用上下面的方法:

            /**
             * Base64 encode / decode
             */
            function Base64() {
                // private property
                _keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
    
                // public method for encoding
                this.encode = function (input) {
                    var output = "";
                    var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
                    var i = 0;
                    input = _utf8_encode(input);
                    while (i < input.length) {
                        chr1 = input.charCodeAt(i++);
                        chr2 = input.charCodeAt(i++);
                        chr3 = input.charCodeAt(i++);
                        enc1 = chr1 >> 2;
                        enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
                        enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
                        enc4 = chr3 & 63;
                        if (isNaN(chr2)) {
                            enc3 = enc4 = 64;
                        } else if (isNaN(chr3)) {
                            enc4 = 64;
                        }
                        output = output +
                            _keyStr.charAt(enc1) + _keyStr.charAt(enc2) +
                            _keyStr.charAt(enc3) + _keyStr.charAt(enc4);
                    }
                    return output;
                }
    
                // public method for decoding
                this.decode = function (input) {
                    var output = "";
                    var chr1, chr2, chr3;
                    var enc1, enc2, enc3, enc4;
                    var i = 0;
                    input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
                    while (i < input.length) {
                        enc1 = _keyStr.indexOf(input.charAt(i++));
                        enc2 = _keyStr.indexOf(input.charAt(i++));
                        enc3 = _keyStr.indexOf(input.charAt(i++));
                        enc4 = _keyStr.indexOf(input.charAt(i++));
                        chr1 = (enc1 << 2) | (enc2 >> 4);
                        chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
                        chr3 = ((enc3 & 3) << 6) | enc4;
                        output = output + String.fromCharCode(chr1);
                        if (enc3 != 64) {
                            output = output + String.fromCharCode(chr2);
                        }
                        if (enc4 != 64) {
                            output = output + String.fromCharCode(chr3);
                        }
                    }
                    output = _utf8_decode(output);
                    return output;
                }
    
                // private method for UTF-8 encoding
                _utf8_encode = function (string) {
                    string = string.replace(/\r\n/g, "\n");
                    var utftext = "";
                    for (var n = 0; n < string.length; n++) {
                        var c = string.charCodeAt(n);
                        if (c < 128) {
                            utftext += String.fromCharCode(c);
                        } else if ((c > 127) && (c < 2048)) {
                            utftext += String.fromCharCode((c >> 6) | 192);
                            utftext += String.fromCharCode((c & 63) | 128);
                        } else {
                            utftext += String.fromCharCode((c >> 12) | 224);
                            utftext += String.fromCharCode(((c >> 6) & 63) | 128);
                            utftext += String.fromCharCode((c & 63) | 128);
                        }
    
                    }
                    return utftext;
                }
    
                // private method for UTF-8 decoding
                _utf8_decode = function (utftext) {
                    var string = "";
                    var i = 0;
                    var c = c1 = c2 = 0;
                    while (i < utftext.length) {
                        c = utftext.charCodeAt(i);
                        if (c < 128) {
                            string += String.fromCharCode(c);
                            i++;
                        } else if ((c > 191) && (c < 224)) {
                            c2 = utftext.charCodeAt(i + 1);
                            string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
                            i += 2;
                        } else {
                            c2 = utftext.charCodeAt(i + 1);
                            c3 = utftext.charCodeAt(i + 2);
                            string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
                            i += 3;
                        }
                    }
                    return string;
                }
            }
    //1.加密  
    var str = '需要加解密的内容';  
    var base = new Base64();  
    var result = base.encode(str);   
      
    //2.解密  
    var result2 = base.decode(result);  
    
    以上是我的个人总结,推荐大家使用第三种方式,对数据进行编码然后保存,需要使用对数据进行解码,这样不会损失细节,也不影响数据库当中的其他数据。



    展开全文
  • 使用mysql数据库的时候,如果字符集是UTF-8并且在php服务器上,当存储emoji表情的时候,会抛出以上异常(比如微信开发获取用户昵称,有的用户的昵称用的是emoji的图像) 这是由于字符集不支持的异常,因为utf-8编码...

    使用mysql数据库的时候,如果字符集是UTF-8并且在php服务器上,当存储emoji表情的时候,会抛出以上异常(比如微信开发获取用户昵称,有的用户的昵称用的是emoji的图像)

    这是由于字符集不支持的异常,因为utf-8编码有可能是两个,三个,四个字节,其中Emoji表情是四个字节,而mysql的utf-8编码最多三个字节,所以导致数据插不进去。
    解决方式:
    一.从数据库层面进行解决(mysql支持utf8mb4的版本是5.5.3+,必须升级到较新版本)
    注意:
    (1.修改database,table,column字符集

    ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
    ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
    ALTER TABLE table_name CHANGE column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

    (2.修改mysql配置文件my.cnf(window为my.ini)

    [client]
    default-character-set = utf8mb4
    [mysql]
    default-character-set = utf8mb4
    [mysqld]
    character-set-client-handshake = FALSE
    character-set-server = utf8mb4
    collation-server = utf8mb4_unicode_ci
    init_connect='SET NAMES utf8mb4'

    3、确保mysql connection版本高于5.1.13否则仍然不能试用utf8mb4

    展开全文
  • 微信开发时,需要将进入系统的用户昵称存入数据.用获取用户信息的微信接口获取到用户的信息后,需要将其存入数据库,但是部分用户的昵称中可能存在表情,需要先编码才能存入,否则可能霍出错 $nickname = base64_encode...
  • 有时候在微信开发过程中,我们会发现有些用户微信昵称有特殊符号的会导致保存数据库失败,所以就需要用代码过滤掉这些特殊的符号,代码如下 package com.xyg.userCenter.common.utils; import java.util.regex....
  • 解决办法:将3个字节的特殊字符与emoji表情替换掉即可。 $nickname = preg_replace('/xE0[x80-x9F][x80-xBF]'.'|xED[xA0-xBF][x80-xBF]/S','?', $nickname ); $nickname = preg_replace('/\xEE[\x80-\xBF][\x80-...
  • 之前做微信公众号项目开发的时候,发现根据微信的接口获得用户的昵称,如果昵称后面有特殊的图标,字符,在网页上展示微信昵称的时候,很容易出现乱码;现解决如下: 将昵称存入数据库的时候,对其进行编码 ...
  • 这里我总结了一下微信开发中从网页授权到获取到用户openid,nickname,headimgurl等信息。 微信开发手册 首先要在微信公众平台中配置好网页授权域名,建议设置为项目域名即可。 thinkPHP5的话建议在...
  • 近些天,在开发的时候,需要接入微信授权登陆,并且需求是登陆后需要将微信的昵称,此时如果微信昵称中有emoji表情,可能会导致数据库存储失败......存取微信昵称时候进行加解密操作 # 存 base64_encode($wechatNicknam...
  • 于是开发出来后安卓环境下无任何的问题,但是ios下却不能分享,还有就是有的微信昵称是表情的 思考后做出一些判断 首先在后台取出微信的昵称后要对昵称进行编码在插入数据库 WxUser wxUser = WxUtils.getWxUser...
  • 由于数据库及属性一致设为utf8,而utf8只支持1-3个字节。当用户昵称为emoji表情时,获取用户基本信息时会乱码。
  • 上周给公司做了一个和微信对接的微信公众号项目,在获取微信用户昵称时有些用户昵称里带特殊符号,导致插入数据库失败。 解决思路: 网上大多数解决方法都是改数据库编码为utf8mb4,让数据库能存下四个字节的特殊...
  • 微信开发的时候有一个很便利的途径来进行一个用户的一步注册登录,就是使用用户的微信信息来直接进行登陆,可以省去很多不必要的麻烦。那具体这些信息是如何来获取的呢? 首先呢,我们需要对微信进行一个授权,让...
  • 微信开发时候在做消息接口交互的时候需要使用带微信加密ID(OpenId),下面讲讲述2中类型方式获取微信OpenID,接收事件推送方式和网页授权获取用户基本信息方式获取。
  • 过年前后做了个微信公众号项目,已经过去一段时间了,抽空回忆总结下基本流程吧,不然很快估计自己就忘了。。 微信公众平台官网:https://mp.weixin.qq.com 文章目录一、注册公众号二、了解公众号管理页面三、必备...
  • 个人微信开发API协议

    2019-09-23 15:05:30
    安卓微信的api,个人微信开发API协议,微信 ipad sdk,微信ipad协议,微信web版接口api,微信网页版接口,微信电脑版sdk,微信开发sdk,微信开发API,微信协议,微信接口文档sdk,替代微信ipad协议的api接口,网页...
1 2 3 4 5 ... 20
收藏数 7,231
精华内容 2,892