解决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小时内删除。
发表评论