java基础(十六) ---- unicode编码

来源:互联网 发布:centos教程 编辑:程序博客网 时间:2024/05/18 03:03

一、 unicode编码
1、 定义
unicode编码简而言之就是将每一个字符用16位2进制数标识。但是通常都用4位的16进制数标识.
例如

1)中文字符串"你好"的unicode码为:\u60\u597d; 2)英文字符串"ab"的unicode码为:\u0061\u0062; 其中\u是标识unicode码用的,后面的4位16进制数则是对应字符的unicode码。 \u -> unicode字符编码unicode 转汉字 -> System.out.println("\u0061\u0062\u6c49\u5b57")  直接输出即可

2、 编码规则
unicode码对每一个字符用4位16进制数表示。具体规则是:将一个字符(char)的高8位与低8位分别取出,转化为16进制数;如果转化的16进制数的长度不足2位,则在其后补0,然后将高、低8位转成的16进制字符串拼接起来并在前面补上”\u” 即可

3、 代码

    public static void main(String[] args) {        System.out.println(convert("张三李四"));        System.out.println(string2Unicode("张三李四"));        String s = "\\u5f20\\u4e09\\u674e\\u56db";        System.out.println(unicode2String(s));    }    /**     * 将字符串转成unicode     * @param str 待转字符串     * @return unicode字符串     */     public static String convert(String str) {        str = (str == null ? "" : str);        String tmp;        StringBuffer sb = new StringBuffer(1000);        char c;        int i, j;        sb.setLength(0);        for (i = 0; i < str.length(); i++) {            c = str.charAt(i);            sb.append("\\u");            j = (c >>> 8); // 取出高8位            tmp = Integer.toHexString(j);            if (tmp.length() == 1)                sb.append("0");            sb.append(tmp);            j = (c & 0xFF); // 取出低8位            tmp = Integer.toHexString(j);            if (tmp.length() == 1)                 sb.append("0");            sb.append(tmp);        }        return (new String(sb));    }    //unicode转成字符串,与上述过程反向操作即可 /** * 将unicode 字符串 * @param str 待转字符串 * @return 普通字符串 */ public static String revert(String str)     {        str = (str == null ? "" : str);        if (str.indexOf("\\u") == -1)// 如果不是unicode码则原样返回            return str;        StringBuffer sb = new StringBuffer(1000);        for (int i = 0; i < str.length() - 6;) {            String strTemp = str.substring(i, i + 6);            String value = strTemp.substring(2);            int c = 0;            for (int j = 0; j < value.length(); j++) {                char tempChar = value.charAt(j);                int t = 0;                switch (tempChar) {                case 'a':                    t = 10;                    break;                case 'b':                    t = 11;                    break;                case 'c':                    t = 12;                    break;                case 'd':                    t = 13;                    break;                case 'e':                    t = 14;                    break;                case 'f':                    t = 15;                    break;                default:                    t = tempChar - 48;                    break;                }                c += t * ((int) Math.pow(16, (value.length() - j - 1)));            }            sb.append((char) c);            i = i + 6;        }        return sb.toString();    }    public static String string2Unicode(String str) {        StringBuffer unicode = new StringBuffer();        for (int i = 0; i < str.length(); i++) {            // 取出每一个字符            char c = str.charAt(i);            // 转换为unicode            unicode.append("\\u" + Integer.toHexString(c));        }        return unicode.toString();    }    /**     * unicode 转字符串     */    public static String unicode2String(String unicode) {        StringBuffer string = new StringBuffer();        String[] hex = unicode.split("\\\\u");        for (int i = 1; i < hex.length; i++) {            // 转换出每一个代码点            int data = Integer.parseInt(hex[i], 16);            System.out.println(data);            // 追加成string            string.append((char) data);        }        return string.toString();    }