微信开发取昵称代码

2018-05-09 15:04:57 qq_38455201 阅读数 13944

我们在做微信开发的时候,有一个很重要的就是通过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);  
以上是我的个人总结,推荐大家使用第三种方式,对数据进行编码然后保存,需要使用对数据进行解码,这样不会损失细节,也不影响数据库当中的其他数据。



2019-06-12 13:01:00 weixin_30596165 阅读数 342

我们在做微信开发的时候,有一个很重要的就是通过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

2015-09-28 10:52:26 qq_15308869 阅读数 9825

起因:

  • 由于数据库及属性一致设为utf8,而utf8只支持1-3个字节。当用户昵称为emoji表情时,获取用户基本信息时会乱码。

解决步骤:

  1. 升级mysql到5.5以上,即建库时可以使用utf8mb4编码。
  2. 更改mysql设置,更改/etc/my.cnf配置文件。
    在[client]加入default-character-set=utf8mb4;
    在[mysqld]加入character_set_server = utf8mb4;
  3. 重启mysql数据库。把要插入特殊表情的数据库、表、字段的编码改成utf8mb4。
2018-11-17 12:38:27 duoduozk 阅读数 2101

做微信公众号或者小程序开发时,经常会有需要存储用户昵称的地方,但是微信对昵称兼容比较多,像表情符号特殊符号什么的都能存进去,这样的话,如果数据库字符集设置成utf8就好报如下错误:

Incorrect string value: '\xF0\x9F\x99\x8F' for column 

这时候只需要把数据库字符集调整成utf8mb4,然后php的话,在操作数据库的时候,加上以下代码:

Db::query('SET NAMES utf8mb4');

这样就可以解决啦。

取数据的时候也加上以上代码,就可以把原来的表情等符号原封不动的再输出出来哦。

 

2019-06-26 17:57:57 biu_biu_duda 阅读数 3227

微信用户昵称特殊符号处理

微信用户昵称特殊符号处理

有时候在微信开发过程中,我们会发现有些用户微信昵称有特殊符号的会导致保存数据库失败,所以就需要用代码过滤掉这些特殊的符号,代码如下
或者可以将数据库编码改为uft8mb4,存储这个字段的编码也改为utf8mb4

package com.xyg.userCenter.common.utils;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class EmojiUtils {
    public static String filter(String str){
        if(str == null || str.length() == 0){
            return "";
        }
        StringBuffer sb = new StringBuffer();
        for(int i=0;i<str.length();i++){
            int ch = str.charAt(i);
            int min = Integer.parseInt("E001", 16);
            int max = Integer.parseInt("E537", 16);
            if(ch >= min && ch <= max){
                sb.append("");
            }else{
                sb.append((char)ch);
            }
        }
        return sb.toString();
    }
    
    /**
     * 过滤昵称特殊表情
     */
    public static String filterName(String name) {
        if(name==null){
            return null;

        }
        if("".equals(name.trim())){
            return "";
        }

        Pattern patter = Pattern.compile("[a-zA-Z0-9\u4e00-\u9fa5]");
        Matcher match = patter.matcher(name);

        StringBuffer buffer = new StringBuffer();

        while (match.find()) {
            buffer.append(match.group());
        }

        return buffer.toString();
    }
    
    /**
     * 测试代码,里面的内容复制粘贴到微信然后发送就可以看到
     * @param args
     */
    public static void main(String[] args) {
        System.out.println(filter("啊阿萨德发秦莞尔"));
    }
}