RISEBY
public static String GBK2UTF8(String gbkStr) { try { return new String(gbk2utf8(gbkStr), "UTF-8"); } catch (UnsupportedEncodingException e) { throw new InternalError(); } } private static byte[] gbk2utf8(String gbkStr) { int n = gbkStr.length(); byte[] utfBytes = new byte[3 * n]; int k = 0; for (int i = 0; i < n; i++) { int m = gbkStr.charAt(i); if (m < 128 && m >= -128) { utfBytes[k++] = (byte) m; continue; } String word = Integer.toBinaryString(m); StringBuilder sb = new StringBuilder(); int len = 16 - word.length(); sb.append("1110"); for (int j = 0; j < len; j++) { sb.append("0"); } sb.append(word); sb.insert(8, "10"); sb.insert(16, "10"); String s1 = sb.substring(0, 8); String s2 = sb.substring(8, 16); String s3 = sb.substring(16); byte b0 = Integer.valueOf(s1, 2).byteValue(); byte b1 = Integer.valueOf(s2, 2).byteValue(); byte b2 = Integer.valueOf(s3, 2).byteValue(); utfBytes[k++] = b0; utfBytes[k++] = b1; utfBytes[k++] = b2; } if (k < utfBytes.length) { byte[] tmp = new byte[k]; System.arraycopy(utfBytes, 0, tmp, 0, k); return tmp; } return utfBytes; }