Unicode原理和互转中文

代码点
Unicode标准的本意很简单:希望给世界上每一种文字系统的每一个字符,都分配一个唯一的整数,这些整数叫做代码点(Code Points)。

代码空间
所有的代码点构成一个代码空间(Code Space),根据Unicode定义,总共有1,114,112个代码点,编号从0x0到0x10FFFF。换句话说,如果每个代码点都能够代表一个有效字符的话,Unicode标准最多能够编码1,114,112,也就是大概110多万个字符。最新的Unicode标准(7.0)已经给超过11万个字符分配了代码点。

代码平面
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();
    }

  

 

posted @ 2019-09-02 12:01  巴黎爱工作  阅读(714)  评论(0编辑  收藏  举报