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. import java.io.UnsupportedEncodingException;
  3. public class TestEncoder {
  4. /**
  5. * @param args
  6. */
  7. public static void main(String[] args) throws Exception {
  8. String gbk = "iteye问答频道编码转换问题";
  9. String iso = new String(gbk.getBytes("UTF-8"),"ISO-8859-1");
  10. System.out.println(iso);
  11. String utf8 = new String(iso.getBytes("ISO-8859-1"),"UTF-8");
  12. System.out.println(utf8);
  13. System.out.println(getUTF8StringFromGBKString(gbk));
  14. }
  15. public static String getUTF8StringFromGBKString(String gbkStr) {
  16. try {
  17. return new String(getUTF8BytesFromGBKString(gbkStr), "UTF-8");
  18. } catch (UnsupportedEncodingException e) {
  19. throw new InternalError();
  20. }
  21. }
  22. public static byte[] getUTF8BytesFromGBKString(String gbkStr) {
  23. int n = gbkStr.length();
  24. byte[] utfBytes = new byte[3 * n];
  25. int k = 0;
  26. for (int i = 0; i < n; i++) {
  27. int m = gbkStr.charAt(i);
  28. if (m < 128 && m >= 0) {
  29. utfBytes[k++] = (byte) m;
  30. continue;
  31. }
  32. utfBytes[k++] = (byte) (0xe0 | (m >> 12));
  33. utfBytes[k++] = (byte) (0x80 | ((m >> 6) & 0x3f));
  34. utfBytes[k++] = (byte) (0x80 | (m & 0x3f));
  35. }
  36. if (k < utfBytes.length) {
  37. byte[] tmp = new byte[k];
  38. System.arraycopy(utfBytes, 0, tmp, 0, k);
  39. return tmp;
  40. }
  41. return utfBytes;
  42. }
  43. }

或者:

  1. public static void gbk2Utf() throws UnsupportedEncodingException {
  2. String gbk = "我来了";
  3. char[] c = gbk.toCharArray();
  4. byte[] fullByte = new byte[3*c.length];
  5. for (int i=0; i<c.length; i++) {
  6. String binary = Integer.toBinaryString(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. }

转载于:https://www.cnblogs.com/xijin-wu/p/5884822.html

解决GBK字符转UTF-8乱码问题相关推荐

  1. php 入库乱码,解决php 中文字符入库或显示乱码的简单示例

    这篇文章主要为大家详细介绍了解决php 中文字符入库或显示乱码的简单示例,具有一定的参考价值,可以用来参考一下. 感兴趣的小伙伴,下面一起跟随512笔记的小编小韵来看看吧!大家以后在编写过程中, 一定 ...

  2. phpmyadmin设置编码和字符集gbk或utf8_导入中文乱码解决方法

    phpmyadmin设置编码和字符集gbk或utf8_导入中文乱码解决方法 参考文章: (1)phpmyadmin设置编码和字符集gbk或utf8_导入中文乱码解决方法 (2)https://www. ...

  3. python将excel转csv乱码_python解决csv文件用excel打开乱码问题

    [问题] python输出的csv文件用excel打开,里面的中文会变成乱码,但用window下的记事本或mac下的numbers打开就正常显示. 原因是python输出的文件是utf-8编码写入的, ...

  4. 解决Fiddler查看Post参数中文乱码的问题

    解决Fiddler查看Post参数中文乱码的问题 解决方法: 1.win+R 2.打开注册表编辑器:输入regedit +回车+是 3.HKEY_CURRENT_USER\Software\Micro ...

  5. 解决idea显示properties文件中文乱码

    解决idea显示properties文件中文乱码 在项目中通常会遇到如下问题,突然properties文件中文就显示为\u5730等等这样类似的字符 解决方法如下 File->Settings- ...

  6. Java 字符的 编码 与 乱码 和恢复

    这里写目录标题 常见非Unicode编码 1.ASCII 2.ISO 8859-1 3.Windows-1252 4.GB2312 5.GBK 6.GB18030 7.Big5 8.编码汇总 2.3. ...

  7. 字符 字符集 编码 以及乱码

    字符: 各种文字和符号的总称,如一个符号,一个字母 字符集:表示所有字符的集合,就相当于一个二维表,收录能显示的所有的字符.常见的字符集合有ASCII,GB2312,GBK,GB18030,BIG5, ...

  8. 成功解决连接SQL输出出现中文乱码问题(10001, 'oracle¿ìËÙÈëÃÅ', 'Íõº£ÁÁ', 'Ë®Àû³ö°æÉç',

    成功解决连接SQL输出出现中文乱码问题(10001, 'oracle¿ìËÙÈëÃÅ', 'Íõº£ÁÁ', 'Ë®Àû³ö°æÉç', 目录 解决问题 解决思路 解决方法 解决问题 解决连接SQL出 ...

  9. java http请求 乱码_怎么解决java中的http请求乱码

    怎么解决java中的http请求乱码 发布时间:2020-06-23 20:00:11 来源:亿速云 阅读:90 作者:元一 怎么解决java中的http请求乱码?针对这个问题,今天小编总结了这篇文章 ...

  10. mysql 5.0 乱码,解决MySQL 5.0.16的乱码问题

    导读:问:怎样解决MySQL 5.0.16的乱码问题? 答:MySQL 5.0.16的乱码问题可以用下面的方法解决: 1.设置phpMyAdmin Language:Chinese simplifie ...

最新文章

  1. vue.js与ajax删除,javascript - VueJs和VueResource,从Ajax请求中删除标头字段 - 堆栈内存溢出...
  2. ubuntu 64上的GCC如何编译32位程序
  3. 一个TextView使用不同的颜色
  4. 3d打印主要的切片参数类型_3D打印机切片参数详情说明
  5. 如何把安静的程序员逼成话唠
  6. Python 俄罗斯方块, 基于pyqt5实现俄罗斯方块 --pyqt5 进阶
  7. 深度学习(六十七)metal forge深度学习库使用
  8. C++ vector容器类型 (转)
  9. 理解Attention机制原理及模型
  10. 一个 JVM 参数引发的频繁 CMS GC
  11. 996 的程序员,只能云养娃吗?
  12. linux命令:FTP服务
  13. 服务器子系统设备结构图,设备集中管理的方法、服务端和系统
  14. 寻找最佳特征维度_寻找5种最佳设计模式书
  15. paip.重装系统需要备份的资料总结..
  16. 再见也是永别——告别即将消逝的雅虎邮箱
  17. cx_Oracle连接数据库报DPI-1047: Cannot locate a 64-bit Oracle Client library
  18. 算法笔记习题 2-9小节
  19. 电力-二次融合FTU技术规范
  20. 数据库--循环语句:for循环

热门文章

  1. 第七章思维导图前半段
  2. 聊聊缓存淘汰算法-LRU 实现原理
  3. MyEclipse插件不能安装原因
  4. Centos7.x 安装Kubernetes(K8s) 1.14.3 nginx 部署 案例
  5. 阶段5 3.微服务项目【学成在线】_day02 CMS前端开发_25-前后端请求响应流程小结...
  6. 总结Verilog中always语句的使用
  7. 3) Maven 目录结构
  8. 三 数据结构 --数和二叉树
  9. 基于公网smtp协议实现邮件服务器
  10. (转)C# 解析 json