解决GBK字符转UTF-8乱码问题
解决GBK字符转UTF-8乱码问题
gbk转utf-8,奇数中⽂乱码。
⼀、乱码的原因
gbk的中⽂编码是⼀个汉字⽤【2】个字节表⽰,例如汉字“内部”的gbk编码16进制的显⽰为c4 da b2 bf
utf-8的中⽂编码是⼀个汉字⽤【3】个字节表⽰,例如汉字“内部”的utf-8编码16进制的显⽰为e5 86 85 e9 83 a8
很显然,gbk是⽆法直接转换成utf-8,少字节变为多字节
⼆、转换的办法
1.⾸先将gbk字符串getBytes()得到两个原始字节,转换成⼆进制字符流,共16位。
2.根据UTF-8的汉字编码规则,⾸字节以1110开头,次字节以10开头,第3字节以10开头。在原始的2进制字符串中插⼊标志位。最终的长度从16--->16+3+2+2=24。
3.转换完成
通过以下⽅法将GBK字符转成UTF-8编码格式的byte【】数组
1. package test;
2.
3. import java.io.UnsupportedEncodingException;
4.
5. public class TestEncoder {
6.
7.    /**
8.      * @param args
9.      */
10.    public static void main(String[] args) throws Exception {
11.        String gbk = "iteye问答频道编码转换问题";
12.
13.        String iso = new Bytes("UTF-8"),"ISO-8859-1");
14.
15.        System.out.println(iso);
16.
17.        String utf8 = new Bytes("ISO-8859-1"),"UTF-8");
18.        System.out.println(utf8);
19.
20.        System.out.println(getUTF8StringFromGBKString(gbk));
汉字编码21.    }
22.
23.    public static String getUTF8StringFromGBKString(String gbkStr) {
24.        try {
25.            return new String(getUTF8BytesFromGBKString(gbkStr), "UTF-8");
26.        } catch (UnsupportedEncodingException e) {
27.            throw new InternalError();
28.        }
29.    }
30.
31.    public static byte[] getUTF8BytesFromGBKString(String gbkStr) {
32.        int n = gbkStr.length();
33.        byte[] utfBytes = new byte[3 * n];
34.        int k = 0;
35.        for (int i = 0; i < n; i++) {
36.            int m = gbkStr.charAt(i);
37.            if (m < 128 && m >= 0) {
38.                utfBytes[k++] = (byte) m;
39.                continue;
40.            }
41.            utfBytes[k++] = (byte) (0xe0 | (m >> 12));
42.            utfBytes[k++] = (byte) (0x80 | ((m >> 6) & 0x3f));
43.            utfBytes[k++] = (byte) (0x80 | (m & 0x3f));
44.        }
45.        if (k < utfBytes.length) {
46.            byte[] tmp = new byte[k];
47.            System.arraycopy(utfBytes, 0, tmp, 0, k);
48.            return tmp;
49.        }
50.        return utfBytes;
51.    }
52. }
或者:
1. public static void gbk2Utf() throws UnsupportedEncodingException {
2.    String gbk = "我来了";
3.    char[] c = CharArray();
4.    byte[] fullByte = new byte[3*c.length];
5.    for (int i=0; i<c.length; i++) {
6.        String binary = BinaryString(c[i]);
7.        StringBuffer sb = new StringBuffer();
8.        int len = 16 - binary.length();
9.        //前⾯补零
10.        for(int j=0; j<len; j++){
11.                sb.append("0");
12.            }
13.        sb.append(binary);
14.        //增加位,达到到24位3个字节
15.        sb.insert(0, "1110");
16.            sb.insert(8, "10");
17.            sb.insert(16, "10");
18.            fullByte[i*3] = Integer.valueOf(sb.substring(0, 8), 2).byteValue();//⼆进制字符串创建整型
19.            fullByte[i*3+1] = Integer.valueOf(sb.substring(8, 16), 2).byteValue();
20.            fullByte[i*3+2] = Integer.valueOf(sb.substring(16, 24), 2).byteValue();
21.    }
22.    //模拟UTF-8编码的⽹站显⽰
23.    System.out.println(new String(fullByte,"UTF-8"));
24. }

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。