解决gbk转utf8乱码

2023-11-11

解决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"));  
} 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

解决gbk转utf8乱码 的相关文章

随机推荐

  • SpringFramework历史版本

    SpringFramework历史版本 对于Spring而言 迄今已有14年历史了 版本也到达了5 0 作为JavaWEB开发领域的常青树 现在Spirng已不再简单是一个框架了 在Spring的项目中主要有 SpringFramework
  • qt Example Manifest Files

    manifest file 是有qdoc根据example对应的 qdocconf qdoc文件生成的 主要用于在qtcreator 的欢迎 welcome gt 示例 examples 中辅助显示内容项 其文件格式为xml格式 后缀名为
  • hdu 1827 Summer Holiday 强连通分量缩点

    题目 http acm hdu edu cn showproblem php pid 1827 题意 听说lcy帮大家预定了新马泰7日游 Wiskey真是高兴的夜不能寐啊 他想着得快点把这消息告诉大家 虽然他手上有所有人的联系方式 但是一个
  • 使用docker搭建Hadoop

    Hadoop简介 1 Hadoop的整体框架 Hadoop由HDFS MapReduce HBase Hive和ZooKeeper等成员组成 其中最基础最重要元素为底层用于存储集群中所有存储节点文件的文件系统HDFS Hadoop Dist
  • MVC模式 &三层架构思想完成增删改查.

    MVC模式图解 三层架构图解 表现层 业务逻辑层 数据访问层互不干扰 也就是说比如我们表现层更改代码不会干涉到其他两层 com itheima web 这代表的是包名 也就是说最好把表现层或者业务逻辑层放到此对应的包名下 以后会用三大框架封
  • 2014年腾讯,百度,微软等校园招聘笔试题...

    腾讯2014年校园招聘笔试题 2014年阿里巴巴校招笔试题北京站 涉及C JAVA 数据结构
  • 基于SDF的抽骨架之散点图(Projected points)

    span style font family none background color rgb 255 255 255 1 SDF 形状直径函数 span span style font family none background co
  • element-ui表格实现跨页多选

    1 在type selection 的column中添加reserve selection属性 以保留当前所选数据
  • Arduino实验十八 旋转编码器实验

    学习任务 学会使用旋转编码器 关注微信公众号 爱享生活科技 color FF0000 关注微信公众号 爱享生活科技 关注微信公众号 爱享生活科技 组件 Arduion主板 旋转编码器 I2CLCD1602液晶显示器 杜邦线 面包板 下图是旋
  • JS base64与utf8相互转换

    utf8Url utf8编码字符串 let base64URL Buffer from utf8Url toString base64 base64UR base64编码字符串 let utf8Url Buffer from base64U
  • 李开复创业了

    上周五9月4日 一看新闻 头条就是 李开复离开Google 准备创业 等新闻 我吓了一跳 李开复作为全球一流企业的高管 居然都辞职不干了 记得李开复在大学生心目中一直都是导师的身份 他为我们写了7封信了 教导着中国的新生代怎么面对困难 积极
  • 基于Udacity模拟器的端到端自动驾驶决策

    1 端到端自动驾驶决策 端到端自动驾驶决策的输入为车辆的感知信息 如摄像头信息 输出为车辆的前轮转角和摄像头等信息 如上图所示 为英伟达公司的端到端自动驾驶决策框架 其CNN网络如下图所示 其中包括一个归一化层 5个卷积层和3个完全的全连接
  • oracle获取某一天某个时间点

    例如每个月12号18点时间 trunc add months last day FBizDate 1 12 18 24
  • Python之第九章 组织文件

    一 shutil模块 shutil 或称为 shell 工具 模块中包含一些函数 让你在 Python 程序中复制 移动 改名和删除文件 要使用 shutil 的函数 首先需要 import shutil 1 复制文件和文件夹 gt gt
  • Linux下Gcc生成和使用静态库和动态库详解(转)

    原文地址 http my chinaunix net space php uid 23592843 do blog id 223539 一 基本概念 1 1什么是库 在windows平台和linux平台下都大量存在着库 本质上来说库是一种可
  • Pip源地址和.condarc(conda 配置文件)

    1 pip源 清华源地址 https pypi tuna tsinghua edu cn simple 阿里源地址 https mirrors aliyun com pypi simple 官方源地址 https pypi python o
  • 使用动态链接库的好处

    1 可以采用多种编程语言来编写 2 增强产品的功能 3 提供二次开发的平台 4 简化项目管理 5 可以节省磁盘空间和内存 6 有助于资源的共享 7 有助于实现应用程序的本地化 更多内容请看C C 动态链接库 DLL 详解 来源 孙鑫 VC
  • 真正的人工智能支付时代已经来临

    我国就开始掀起人工智能热潮 随着互联网推动数字化的普及以及计算能力的进一步提高 真正的人工智能时代已经来临 刷脸支付基于人脸识别这种人工智能技术 已经广泛应用于商超 零售 医疗 景区等各大生活场景 刷脸支付做为2019年的迸发元年 嗅到商机
  • vue:分页跳转页面详情,返回记住当前点击第几页

    背景 项目中从列表页跳转到详情页返回的时候会默认跳转到分页的第一页 不利于用户的体验 所以需要返回到当前页 实现方法 方法一 Vue2提供了组件级路由钩子函数 分别是beforeRouteEnter beforeRouteUpdate be
  • 解决gbk转utf8乱码

    解决GBK字符转UTF 8乱码问题 gbk转utf 8 奇数中文乱码 一 乱码的原因 gbk的中文编码是一个汉字用 2 个字节表示 例如汉字 内部 的gbk编码16进制的显示为c4 da b2 bf utf 8的中文编码是一个汉字用 3 个