解决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【】数组
- package test;
- import java.io.UnsupportedEncodingException;
- public class TestEncoder {
- /**
- * @param args
- */
- public static void main(String[] args) throws Exception {
- String gbk = "iteye问答频道编码转换问题";
- String iso = new String(gbk.getBytes("UTF-8"),"ISO-8859-1");
- System.out.println(iso);
- String utf8 = new String(iso.getBytes("ISO-8859-1"),"UTF-8");
- System.out.println(utf8);
- System.out.println(getUTF8StringFromGBKString(gbk));
- }
- public static String getUTF8StringFromGBKString(String gbkStr) {
- try {
- return new String(getUTF8BytesFromGBKString(gbkStr), "UTF-8");
- } catch (UnsupportedEncodingException e) {
- throw new InternalError();
- }
- }
- public static byte[] getUTF8BytesFromGBKString(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 >= 0) {
- utfBytes[k++] = (byte) m;
- continue;
- }
- utfBytes[k++] = (byte) (0xe0 | (m >> 12));
- utfBytes[k++] = (byte) (0x80 | ((m >> 6) & 0x3f));
- utfBytes[k++] = (byte) (0x80 | (m & 0x3f));
- }
- if (k < utfBytes.length) {
- byte[] tmp = new byte[k];
- System.arraycopy(utfBytes, 0, tmp, 0, k);
- return tmp;
- }
- return utfBytes;
- }
- }
或者:
- public static void gbk2Utf() throws UnsupportedEncodingException {
- String gbk = "我来了";
- char[] c = gbk.toCharArray();
- byte[] fullByte = new byte[3*c.length];
- for (int i=0; i<c.length; i++) {
- String binary = Integer.toBinaryString(c[i]);
- StringBuffer sb = new StringBuffer();
- int len = 16 - binary.length();
- //前面补零
- for(int j=0; j<len; j++){
- sb.append("0");
- }
- sb.append(binary);
- //增加位,达到到24位3个字节
- sb.insert(0, "1110");
- sb.insert(8, "10");
- sb.insert(16, "10");
- fullByte[i*3] = Integer.valueOf(sb.substring(0, 8), 2).byteValue();//二进制字符串创建整型
- fullByte[i*3+1] = Integer.valueOf(sb.substring(8, 16), 2).byteValue();
- fullByte[i*3+2] = Integer.valueOf(sb.substring(16, 24), 2).byteValue();
- }
- //模拟UTF-8编码的网站显示
- System.out.println(new String(fullByte,"UTF-8"));
- }
转载于:https://www.cnblogs.com/xijin-wu/p/5884822.html
解决GBK字符转UTF-8乱码问题相关推荐
- php 入库乱码,解决php 中文字符入库或显示乱码的简单示例
这篇文章主要为大家详细介绍了解决php 中文字符入库或显示乱码的简单示例,具有一定的参考价值,可以用来参考一下. 感兴趣的小伙伴,下面一起跟随512笔记的小编小韵来看看吧!大家以后在编写过程中, 一定 ...
- phpmyadmin设置编码和字符集gbk或utf8_导入中文乱码解决方法
phpmyadmin设置编码和字符集gbk或utf8_导入中文乱码解决方法 参考文章: (1)phpmyadmin设置编码和字符集gbk或utf8_导入中文乱码解决方法 (2)https://www. ...
- python将excel转csv乱码_python解决csv文件用excel打开乱码问题
[问题] python输出的csv文件用excel打开,里面的中文会变成乱码,但用window下的记事本或mac下的numbers打开就正常显示. 原因是python输出的文件是utf-8编码写入的, ...
- 解决Fiddler查看Post参数中文乱码的问题
解决Fiddler查看Post参数中文乱码的问题 解决方法: 1.win+R 2.打开注册表编辑器:输入regedit +回车+是 3.HKEY_CURRENT_USER\Software\Micro ...
- 解决idea显示properties文件中文乱码
解决idea显示properties文件中文乱码 在项目中通常会遇到如下问题,突然properties文件中文就显示为\u5730等等这样类似的字符 解决方法如下 File->Settings- ...
- Java 字符的 编码 与 乱码 和恢复
这里写目录标题 常见非Unicode编码 1.ASCII 2.ISO 8859-1 3.Windows-1252 4.GB2312 5.GBK 6.GB18030 7.Big5 8.编码汇总 2.3. ...
- 字符 字符集 编码 以及乱码
字符: 各种文字和符号的总称,如一个符号,一个字母 字符集:表示所有字符的集合,就相当于一个二维表,收录能显示的所有的字符.常见的字符集合有ASCII,GB2312,GBK,GB18030,BIG5, ...
- 成功解决连接SQL输出出现中文乱码问题(10001, 'oracle¿ìËÙÈëÃÅ', 'Íõº£ÁÁ', 'Ë®Àû³ö°æÉç',
成功解决连接SQL输出出现中文乱码问题(10001, 'oracle¿ìËÙÈëÃÅ', 'Íõº£ÁÁ', 'Ë®Àû³ö°æÉç', 目录 解决问题 解决思路 解决方法 解决问题 解决连接SQL出 ...
- java http请求 乱码_怎么解决java中的http请求乱码
怎么解决java中的http请求乱码 发布时间:2020-06-23 20:00:11 来源:亿速云 阅读:90 作者:元一 怎么解决java中的http请求乱码?针对这个问题,今天小编总结了这篇文章 ...
- mysql 5.0 乱码,解决MySQL 5.0.16的乱码问题
导读:问:怎样解决MySQL 5.0.16的乱码问题? 答:MySQL 5.0.16的乱码问题可以用下面的方法解决: 1.设置phpMyAdmin Language:Chinese simplifie ...
最新文章
- vue.js与ajax删除,javascript - VueJs和VueResource,从Ajax请求中删除标头字段 - 堆栈内存溢出...
- ubuntu 64上的GCC如何编译32位程序
- 一个TextView使用不同的颜色
- 3d打印主要的切片参数类型_3D打印机切片参数详情说明
- 如何把安静的程序员逼成话唠
- Python 俄罗斯方块, 基于pyqt5实现俄罗斯方块 --pyqt5 进阶
- 深度学习(六十七)metal forge深度学习库使用
- C++ vector容器类型 (转)
- 理解Attention机制原理及模型
- 一个 JVM 参数引发的频繁 CMS GC
- 996 的程序员,只能云养娃吗?
- linux命令:FTP服务
- 服务器子系统设备结构图,设备集中管理的方法、服务端和系统
- 寻找最佳特征维度_寻找5种最佳设计模式书
- paip.重装系统需要备份的资料总结..
- 再见也是永别——告别即将消逝的雅虎邮箱
- cx_Oracle连接数据库报DPI-1047: Cannot locate a 64-bit Oracle Client library
- 算法笔记习题 2-9小节
- 电力-二次融合FTU技术规范
- 数据库--循环语句:for循环
热门文章
- 第七章思维导图前半段
- 聊聊缓存淘汰算法-LRU 实现原理
- MyEclipse插件不能安装原因
- Centos7.x 安装Kubernetes(K8s) 1.14.3 nginx 部署 案例
- 阶段5 3.微服务项目【学成在线】_day02 CMS前端开发_25-前后端请求响应流程小结...
- 总结Verilog中always语句的使用
- 3) Maven 目录结构
- 三 数据结构 --数和二叉树
- 基于公网smtp协议实现邮件服务器
- (转)C# 解析 json