现在的位置: 首页 > 综合 > 正文

GB2312与UTF-8编码

2018年04月19日 ⁄ 综合 ⁄ 共 1650字 ⁄ 字号 评论关闭

        接触java有些年头了,以前做J2EE程序的时候,也遇到过编码问题,但是大部分都可以很轻松的解决。现在做移动开发,才发现,有些手机不支持GB2312,不支持,坑爹啊!

        在java程序中,对编码的转换一般如下:

		String str = new String("你妹".getBytes(),"UTF-8");
		String str = new String("你妹".getBytes("GB2312"),"UTF-8");

第一行是通过默认编码,得到“你妹”的字节数组,然后转化为UTF-8编码,第二行是以GB2312编码得到“你妹”的字节数组,然后转化为UTF-8编码。

 

        说实话,我对编码了解的不多,就知道中文需要支持中文的编码,一般情况下使用UTF-8或者GB2312,而我使用转码的情况,大多是网络接收数据的时候,得到一个字节数组,然后使用:

                  new String("你妹".getBytes(),"UTF-8");

得到指定编码的结果。

       但是这里有一个条件,那就是传过来的数据,必须是UTF-8编码的,如果不是,那么会出现编码异常。

 

        最近有一个傻逼需求,服务器那边只可以给出GB2312的编码,但是部分手机不支持GB2312,把我搞了很久,后来借助于第三方的东西,才搞定,现在介绍一下这个第三方程序的使用。

       首先它有一个GB2312编码和UTF-8编码的映射文件,然后通过这个文件,来把GB2312转化为UTF-8(由于博客不可以上传附件,所以有需求的朋友,留邮箱)

 

      下面是工具类:

package app.util;

import java.io.InputStream;

public class HGB2312 {


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

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

	public String gb2utf8(byte[] gb) {
		StringBuffer sb = new StringBuffer();
		int c, h, l, ind;
		for (int i = 0; i < gb.length;) {
			if (gb[i] >= 0) {
				sb.append((char) gb[i++]);
			} else {
				h = 256 + gb[i++];
				l = 256 + gb[i++];
				h = h - 0xA0 - 1;
				l = l - 0xA0 - 1;
				// if (h <= 9) {
				if (h < 9) {
					ind = (h * 94 + l) << 1;
					if (ind >= map.length || ind < 0) { // 越界则记0
						sb.append((char)0);
					} else {
						c = (byte2Int(map[ind]) << 8 | byte2Int(map[ind + 1]));
						sb.append((char) c);
					}
					// } else if (h > 9 && h < 16) {
				} else if (h >= 9 && h <= 14) {
					sb.append((char) 0);
					// } else if (h >= 16) {
				} else if (h > 14) {
					h -= 6;
					ind = (h * 94 + l) << 1;

					if (ind >= map.length || ind < 0) { // 越界则记0
						sb.append(0);
					} else {
						c = (byte2Int(map[ind]) << 8 | byte2Int(map[ind + 1]));
						sb.append((char) c);
					}

				} else {
					sb.append((char) 0);
				}
			}
		}
		return sb.toString();
	}

	private int byte2Int(byte b) {
		if (b < 0) {
			return 256 + b;
		} else {
			return b;
		}
	}
}

     具体的使用方法非常简单:初始化HGB2312并调用gb2utf8即可。

 

     有其他方法的朋友欢迎留言,分享,也是一种美德……

抱歉!评论已关闭.