##

前言

Github:https://github.com/HealerJean

博客:http://blog.healerjean.com

在接到唯一可接口的时候,莫名其妙的将本来好好的中文搞成了乱码,气的我啊,一直找问题,找不到。后来发现日志中的数据变成了一堆类似乱码的,形状,亏我见多识广哈,一眼就知道是Uriencode编码。那么为什么对方要将返回值设置为这种编码呢。

Unicode是什么

Unicode(统一码、万国码、单一码)是计算机科学领域里的一项业界标准,包括字符集、编码方案等。 Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。1990年开始研发,1994年正式公布。 Unicode 标准为全球商业领域中广泛使用的大部分字符定义了一个单一编码方案。所有的计算机都用单一的 Unicode 标准 Unicode 数据中的位模式一致地翻译成字符。这保证了同一个位模式在所有的计算机上总是转换成同一个字符。数据可以随意地从一个数据库或计算机传送到另一个数据库或计算机,而不用担心接收系统是否会错误地翻译位模式。

所以明白了吧,为了跨语言,跨平台,Unicode产生了 Unicode通常用两个字节表示一个字符,原有的英文编码从单字节变成双字节,只需要把高字节全部填为0就可以。

Stirng.length()


    String类的length()方法是以unicode统一字符集代码单元
    换言之就是char的个数为来统计的
    因为java一个char类型可以存放一个汉字2个字节)。
    所以使用subString等截取出来的子串都不会出现半个汉字的情况

以后面对国际化开发的时候,我们还是使用Unicode进行编码下给返回结果,这样的话,就不会因为字符编码造成一些字符格式误差了


package com.duodian.youhui.admin.utils;

/**
 * @Desc: 订单接口的时候 9月21日 出现返回接口为Unicode编码的情况,我开始添加的
 *
{"msg":"\u64cd\u4f5c\u6210\u529f","error":0,"data":null}
{"msg":"操作成功","error":0,"data":null}

 * @Author HealerJean
 * @Date 2018/9/21  下午7:19.
 */
public class UnicodeUtil {




    /**
     * 不管是中文还是unicode编码,不管里面夹杂着什么都输出 正确的中文
     * @param unicodeStr
     * @return
     */
    public static String decode(String unicodeStr) {
        if (unicodeStr == null) {
            return null;
        }
        StringBuffer retBuf = new StringBuffer();
        int maxLoop = unicodeStr.length();
        for (int i = 0; i < maxLoop; i++) {
            if (unicodeStr.charAt(i) == '\\') {
                if ((i < maxLoop - 5)
                        && ((unicodeStr.charAt(i + 1) == 'u') || (unicodeStr
                        .charAt(i + 1) == 'U')))
                    try {
                        retBuf.append((char) Integer.parseInt(
                                unicodeStr.substring(i + 2, i + 6), 16));
                        i += 5;
                    } catch (NumberFormatException localNumberFormatException) {
                        retBuf.append(unicodeStr.charAt(i));
                    }
                else
                    retBuf.append(unicodeStr.charAt(i));
            } else {
                retBuf.append(unicodeStr.charAt(i));
            }
        }
        return retBuf.toString();
    }




    /**
     * 中文,必须是中文
     * unicode 转 中文,只能转化全部都是unicode编码的
     * @param unicode
     * @return
     */
    public  static String unicodeToCn(String unicode) {
        /** 以 \ u 分割,因为java注释也能识别unicode,因此中间加了一个空格*/
        String[] strs = unicode.split("\\\\u");
        String returnStr = "";
        // 由于unicode字符串以 \ u 开头,因此分割出的第一个字符是""。
        for (int i = 1; i < strs.length; i++) {
            returnStr += (char) Integer.valueOf(strs[i], 16).intValue();
        }
        return returnStr;
    }

    /**
     * 必须是中文
     * 中文转Unicode
     * @param cn
     * @return
     */
    public static String cnToUnicode(String cn) {
        char[] chars = cn.toCharArray();
        String returnStr = "";
        for (int i = 0; i < chars.length; i++) {
            returnStr += "\\u" + Integer.toString(chars[i], 16);
        }
        return returnStr;
    }



  public static void main(String[] args) {
        String cn = "全部中文";
        ////\u5168\u90e8\u4e2d\u6587
        System.out.println(cnToUnicode(cn));
        String unicode = "\\u5168\\u90e8\\u4e2d\\u6587";
        ////全部中文
        System.out.println(unicodeToCn(unicode));

        String someUnicode = "{\"msg\":\"\\u64cd\\u4f5c\\u6210\\u529f\",\"error\":0,\"data\":[{\"adzone_id\":\"1782066627\",\"adzone_name\":\"\\u85cf\\u5b9d\\u9601\",\"alipay_total_price\":\"18.0000\",\"auction_category\":\"\\u7f8e\\u5986-\\u7f8e\\u5bb9\\u62a4\\u80a4\",\"commission\":\"0.00\",\"commission_rate\":\"1.0000\",\"create_time\":\"2018-09-21 19:31:47\",\"income_rate\":\"0.3100\",\"item_num\":1,\"item_title\":\"\\u7f8e\\u533b\\u751f\\u9664\\u87a8\\u8ff7\\u8fed\\u9999\\u6d17\\u9762\\u5976\\u5973\\u7537\\u5b66\\u751f\\u63a7\\u6cb9\\u75d8\\u75d8\\u6e05\\u6d01\\u53bb\\u87a8\\u9ed1\\u5934\\u7c89\\u523a\\u6d01\\u9762\\u4e73\",\"num_iid\":532235400390,\"order_type\":\"\\u6dd8\\u5b9d\",\"pay_price\":\"0.00\",\"price\":\"69.00\",\"pub_share_pre_fee\":\"5.58\",\"seller_nick\":\"\\u5e7f\\u5dde\\u7f8e\\u533b\\u751f\\u751f\\u7269\\u79d1\\u6280\",\"seller_shop_title\":\"\\u7f8e\\u533b\\u751f\\u5b98\\u65b9\\u4f01\\u4e1a\\u5e97\",\"site_id\":\"46766627\",\"site_name\":\"\\u5c0f\\u5f53\\u4f18\\u60e0\\u5238\",\"subsidy_fee\":\"0\",\"subsidy_rate\":\"0.0000\",\"subsidy_type\":\"-1\",\"terminal_type\":\"2\",\"tk3rd_type\":\"--\",\"tk_status\":12,\"total_commission_fee\":\"0\",\"total_commission_rate\":\"0.3100\",\"trade_id\":224003948316112915,\"trade_parent_id\":224003948316112915}]}";
        System.out.println("一部分英文,一部分 unicode编码"+decode(someUnicode));
        //一部分英文,一部分 unicode编码{"msg":"操作成功","error":0,"data":[{"adzone_id":"1782066627","adzone_name":"藏宝阁","alipay_total_price":"18.0000","auction_category":"美妆-美容护肤","commission":"0.00","commission_rate":"1.0000","create_time":"2018-09-21 19:31:47","income_rate":"0.3100","item_num":1,"item_title":"美医生除螨迷迭香洗面奶女男学生控油痘痘清洁去螨黑头粉刺洁面乳","num_iid":532235400390,"order_type":"淘宝","pay_price":"0.00","price":"69.00","pub_share_pre_fee":"5.58","seller_nick":"广州美医生生物科技","seller_shop_title":"美医生官方企业店","site_id":"46766627","site_name":"小当优惠券","subsidy_fee":"0","subsidy_rate":"0.0000","subsidy_type":"-1","terminal_type":"2","tk3rd_type":"--","tk_status":12,"total_commission_fee":"0","total_commission_rate":"0.3100","trade_id":224003948316112915,"trade_parent_id":224003948316112915}]}


        String normal = "{\"msg\":\"操作成功\",\"error\":0,\"data\":[{\"adzone_id\":\"1782066627\",\"adzone_name\":\"藏宝阁\",\"alipay_total_price\":\"18.0000\",\"auction_category\":\"美妆-美容护肤\",\"commission\":\"0.00\",\"commission_rate\":\"1.0000\",\"create_time\":\"2018-09-21 19:31:47\",\"income_rate\":\"0.3100\",\"item_num\":1,\"item_title\":\"美医生除螨迷迭香洗面奶女男学生控油痘痘清洁去螨黑头粉刺洁面乳\",\"num_iid\":532235400390,\"order_type\":\"淘宝\",\"pay_price\":\"0.00\",\"price\":\"69.00\",\"pub_share_pre_fee\":\"5.58\",\"seller_nick\":\"广州美医生生物科技\",\"seller_shop_title\":\"美医生官方企业店\",\"site_id\":\"46766627\",\"site_name\":\"小当优惠券\",\"subsidy_fee\":\"0\",\"subsidy_rate\":\"0.0000\",\"subsidy_type\":\"-1\",\"terminal_type\":\"2\",\"tk3rd_type\":\"--\",\"tk_status\":12,\"total_commission_fee\":\"0\",\"total_commission_rate\":\"0.3100\",\"trade_id\":224003948316112915,\"trade_parent_id\":224003948316112915}]}";
        System.out.println("一部分英文,一部分 中文编码"+decode(normal));
        //一部分英文,一部分 中文编码{"msg":"操作成功","error":0,"data":[{"adzone_id":"1782066627","adzone_name":"藏宝阁","alipay_total_price":"18.0000","auction_category":"美妆-美容护肤","commission":"0.00","commission_rate":"1.0000","create_time":"2018-09-21 19:31:47","income_rate":"0.3100","item_num":1,"item_title":"美医生除螨迷迭香洗面奶女男学生控油痘痘清洁去螨黑头粉刺洁面乳","num_iid":532235400390,"order_type":"淘宝","pay_price":"0.00","price":"69.00","pub_share_pre_fee":"5.58","seller_nick":"广州美医生生物科技","seller_shop_title":"美医生官方企业店","site_id":"46766627","site_name":"小当优惠券","subsidy_fee":"0","subsidy_rate":"0.0000","subsidy_type":"-1","terminal_type":"2","tk3rd_type":"--","tk_status":12,"total_commission_fee":"0","total_commission_rate":"0.3100","trade_id":224003948316112915,"trade_parent_id":224003948316112915}]}

    }


}

ContactAuthor