Unicode原理和互轉中文

代碼點
Unicode標準的本意很簡單:但願給世界上每一種文字系統的每個字符,都分配一個惟一的整數,這些整數叫作代碼點(Code Points)。java

代碼空間
全部的代碼點構成一個代碼空間(Code Space),根據Unicode定義,總共有1,114,112個代碼點,編號從0x0到0x10FFFF。換句話說,若是每一個代碼點都可以表明一個有效字符的話,Unicode標準最多可以編碼1,114,112,也就是大概110多萬個字符。最新的Unicode標準(7.0)已經給超過11萬個字符分配了代碼點。app

代碼平面
Unicode標準把代碼點分紅了17個代碼平面(Code Plane),編號爲#0到#16。
每一個代碼平面包含65,536(2^16)個代碼點(17*65,536=1,114,112)。
其中,Plane#0叫作基本多語言平面(Basic Multilingual Plane,BMP),其他平面叫作補充平面(Supplementary Planes)。
Unicode7.0只使用了17個平面中的6個,而且給這6個平面起了名字,以下編碼

 

public String getChineseByunicode(String sunicode) {

        char a;
        int len = sunicode.length();
        StringBuffer outBuffer = new StringBuffer(len);
        for (int b = 0; b < len; ) {
            a = sunicode.charAt(b++);
            if (a == '\\') {
                a = sunicode.charAt(b++);
                if (a == 'u') {
                    int value = 0;
                    for (int i = 0; i < 4; i++) {
                        a = sunicode.charAt(b++);
                        switch (a) {
                            case '0':
                            case '1':
                            case '2':
                            case '3':
                            case '4':
                            case '5':
                            case '6':
                            case '7':
                            case '8':
                            case '9':
                                value = (value << 4) + a - '0';
                                break;
                            case 'a':
                            case 'b':
                            case 'c':
                            case 'd':
                            case 'e':
                            case 'f':
                                value = (value << 4) + 10 + a - 'a';
                                 break;
                            case 'A':
                            case 'B':
                            case 'C':
                            case 'D':
                            case 'E':
                            case 'F':
                                value = (value << 4) + 10 + a - 'A';
                                        break;
                            default:
                                throw new IllegalArgumentException(
                                        "Malformed   \\uxxxx  encoding.");

                        }
                    }
                    outBuffer.append((char) value);
                } else {
                    if (a == 't') a = '\t';
                    else if (a == 'r') a = '\r';
                    else if (a == 'n') a = '\n';
                    else if (a == 'f') a = '\f';
                    outBuffer.append(a);
                }
            } else outBuffer.append(a);
        }
        return outBuffer.toString();
    }
相關文章
相關標籤/搜索