程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> J2ME >> J2ME經驗總結之GB2312轉換為UTF-8

J2ME經驗總結之GB2312轉換為UTF-8

編輯:J2ME

要點:
1,gb2312於unicode或者utf-8之間並不存在直接的映射關系。所以我們只能通過查表法來進行轉換。
2,utf-8是unicode用於網絡傳輸的一種形式,它與unicode之間是可以通過運算來進行轉換的。
3,J2ME環境使用的都是utf-8編碼,但是請注意,J2ME中的utf-8編碼比較特殊,在整個編碼前面對了兩個字節,用於存放字符串的長度。

過程:
1,制作映射表gb2312-unicode,應為漢字的unicode比utf-8要小,這樣做出的表也會小一些,而且對於unicode的可擴展性也強一些。
2,先將gb2312編碼串通過查表,轉換為unicode。
3,然後通過運算,將unicode轉換為utf-8,以便在J2ME環境下使用。

我修改了Herong Yang大俠的一個映射表生成函數,原文請參考http://www.herongyang.com/gb2312/gb2312_unicode.Html
它的作用是生成一個二進制的gb2312到unicode的查找表,它按照gb2312的分區,分塊特性,將其對應的unicode按順序存入指定的位置。
這樣我們只需要根據gb2312的編碼,計算出索引就可以獲取編碼對應的unicode了。
由於是修改的代碼,沒臉貼出來,大家有需求可以直接參考Herong Yang的文章,然後根據自己需求修改並生成自己的映射表。

這裡我把自己這個轉換表文件以及訪問代碼公開。
http://download.csdn.Net/source/263609
轉帖請注明。這是個傻瓜化的代碼,在Java中給它gb2312的byte數組,它就給你構造出字符串。
用在不支持gb2312的手機上非常方便。這個轉換表的大小是15228byte,對J2ME來說還是可以接受的。

如果有朋友需要溝通,可以發郵件到[email protected]

import Java.io.InputStream;

public class HGB2312 {

    private byte[] map = new byte[15228];

    private byte[] buffer;
    private int index;

    public HGB2312() throws Exception {
        InputStream is = getClass().getResourceAsStream("/gb2u.dat");
        is.read(map);
        is.close();
    }

    public String gb2utf8(byte[] gb) throws Exception {
        buffer = new byte[gb.length + gb.length / 2 + 3];
        index = 0;
        int c, h, l, ind;
        for (int i = 0; i < gb.length;) {
            if (gb[i] >= 0) {
                fillBuffer(gb[i++]);
            } else {
                h = 256 + gb[i++];
                l = 256 + gb[i++];
                h = h - 0xA0 - 1;
                l = l - 0xA0 - 1;
                if (h < 9) {
                    ind = (h * 94 + l) << 1;
                    c = (byte2Int(map[ind]) << 8 | byte2Int(map[ind + 1]));
                    fillBuffer(c);
                } else if (h >= 9 && h <= 14) {
                    fillBuffer(0);
                } else if (h > 14) {
                    h -= 6;
                    ind = (h * 94 + l) << 1;
                    c = (byte2Int(map[ind]) << 8 | byte2Int(map[ind + 1]));
                    fillBuffer(c);
                } else {
                    fillBuffer(0);
                }
            }
        }
        // ind = index - 2;
        // h = (byte) ((ind >> 8) & 0x7F);
        // l = (byte) (ind & 0xFF);
        // buffer[0] = h;
        // buffer[1] = l;

        return new String(buffer, 0, index, "UTF-8");
    }

    private void fillBuffer(int value) {
        if (value <= 0x0000007F) {
            buffer[index++] = (byte) value;
        } else if (value >= 0x00000080 && value <= 0x000007FF) {
            byte b1 = (byte) (0x60 | (value >> 6));
            byte b2 = (byte) (0x80 | (value & 0x3F));
            buffer[index++] = b1;
            buffer[index++] = b2;
        } else if (value >= 0x00000800 && value <= 0x0000FFFF) {
            byte b1 = (byte) (0xE0 | (value >> 12));
            byte b2 = (byte) (0x80 | ((value >> 6) & 0x3F));
            byte b3 = (byte) (0x80 | (value & 0x3F));
            buffer[index++] = b1;
            buffer[index++] = b2;
            buffer[index++] = b3;
        } else if (value >= 0x00010000 && value <= 0x001FFFFF) {
            byte b1 = (byte) (0x1E | (value >> 18));
            byte b2 = (byte) (0x80 | ((value >> 12) & 0x3F));
            byte b3 = (byte) (0x80 | ((value >> 6) & 0x3F));
            byte b4 = (byte) (0x80 | (value & 0x3F));
            buffer[index++] = b1;
            buffer[index++] = b2;
            buffer[index++] = b3;
            buffer[index++] = b4;
        } else if (value >= 0x00200000 && value <= 0x03FFFFFF) {
            byte b1 = (byte) (0x3E | (value >> 24));
            byte b2 = (byte) (0x80 | ((value >> 18) & 0x3F));
            byte b3 = (byte) (0x80 | ((value >> 12) & 0x3F));
            byte b4 = (byte) (0x80 | ((value >> 6) & 0x3F));
            byte b5 = (byte) (0x80 | (value & 0x3F));
            buffer[index++] = b1;
            buffer[index++] = b2;
            buffer[index++] = b3;
            buffer[index++] = b4;
            buffer[index++] = b5;
        } else if (value >= 0x04000000 && value <= 0x7FFFFFFF) {
            byte b1 = (byte) (0x7E | (value >> 30));
            byte b2 = (byte) (0x80 | ((value >> 24) & 0x3F));
            byte b3 = (byte) (0x80 | ((value >> 18) & 0x3F));
            byte b4 = (byte) (0x80 | ((value >> 12) & 0x3F));
            byte b5 = (byte) (0x80 | ((value >> 6) & 0x3F));
            byte b6 = (byte) (0x80 | (value & 0x3F));
            buffer[index++] = b1;
            buffer[index++] = b2;
            buffer[index++] = b3;
            buffer[index++] = b4;
            buffer[index++] = b5;
            buffer[index++] = b6;
        }
    }

    private int byte2Int(byte b) {
        if (b < 0) {
            return 256 + b;
        } else {
            return b;
        }
    }
}
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved