解决gbk转utf8乱码_gbk转utf8中文乱码-程序员宅基地

技术标签: java  String  开发语言  

解决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"));  
} 
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_41995845/article/details/124834730

智能推荐

Android gradle aar不能传递依赖_安卓aar不能层层传递-程序员宅基地

文章浏览阅读5.3k次。先来看下gradle依赖的几种常见的关键词新配置 已弃用配置 行为 本Module 上层Module implementation compile 依赖项在编译时对模块可用,并且仅在运行时对模块的消费者可用。 对于大型多项目构建,使用implementation而不是api/compile可以显著缩短构建时间,因为它可以减少构建系统需要重新..._安卓aar不能层层传递

深度学习中神经网络的几种权重初始化方法_神经网络权重初始化方法-程序员宅基地

文章浏览阅读7.2w次,点赞113次,收藏490次。深度学习中神经网络的几种权重初始化方法&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在深度学习中,神经网络的权重初始化方法对(weight initialization)对模型的收敛速度和性能有着至关重要的影响。说白了,神经网络其实就是对权重参数w的不停迭代更新,以期达到较好的性能。在深度神经网络中,随着层数的增多,我们在梯度下降的过程中,极易出现梯度消失..._神经网络权重初始化方法

Source Insight使用技巧_source insight 搜所变成蓝色-程序员宅基地

文章浏览阅读842次。1、设置字体:点击Option -> Document Option->Screen Font 然后进行设置 填上Yes;2、为Source Insight 添加Makefile,kconfig,汇编文件的支持:添加makefile:打开Source Insight,在新建工程之前,进入Options -> Document Options-> 点击Document Type的下拉_source insight 搜所变成蓝色

nested exception is java.lang.ClassNotFoundException: org.springframework.web.servlet.view.json.Json-程序员宅基地

文章浏览阅读5.4k次。配置springmvc的时候总是报这个错误:Caused by: org.springframework.beans.factory.CannotLoadBeanClassException: Cannot find class [org.springframework.web.servlet.view.json.MappingJacksonJsonView] for bean with nam..._nested exception is java.lang.classnotfoundexception: org.springframework.we

Linux下Rsync+sersync实现数据实时同步-程序员宅基地

文章浏览阅读53次。前言:一、为什么要用Rsync+sersync架构?1、sersync是基于Inotify开发的,类似于Inotify-tools的工具2、sersync可以记录下被监听目录中发生变化的(包括增加、删除、修改)具体某一个文件或某一个目录的名字,然后使用rsync同步的时候,只同步发生变化的这个文件或者这个目录。二、Rsync+Inotify-tools与Rsync+sersy...

训练自己大语言模型系列之0302 bert-base-chinese模型的优缺点,主流的适合中文的大语言模型推荐-程序员宅基地

文章浏览阅读927次。BERT(Bidirectional Encoder Representations from Transformers)是一种基于Transformer的预训练语言表示模型,通过在大量文本数据上进行预训练,可以捕捉到丰富的语言知识。BERT-base-chinese是BERT模型的一个变体,专门针对中文文本进行了预训练。_bert-base-chinese

随便推点

S/N,C/I,Ec/Io,Eb/No之间的关系_c/i和c/n-程序员宅基地

文章浏览阅读4k次,点赞2次,收藏8次。定义了业务比特能噪比Eb/N0,用于在业务比特级进行接收性能(功率效率)的衡量。实际上因为业务比特级的能量是无法测量的,Eb/N0必须通过实测的S/N进行推算。以上各参量的参考点如下图所示。Ec就是导频专用,Eb就是业务信道专用1 各种符号1.1 信号符号1. C :载波功率2. Ec:码片的能量3. Eb:业务信道上的比特能量,在95与1x上与Ec的关系为Eb=Ec+W/_c/i和c/n

编码练习——Java-2-流程控制-程序员宅基地

文章浏览阅读1.1k次,点赞2次,收藏3次。条件条件语句 - ifpublic class Test { public static void main(String[] args) { int a = 100; if(a==100) { System.out.println("a的值是 100"); } }}public class Test {

mouseMoveEvent 函数中判断鼠标那个按键按下_if(event->button()&qt::leftbutton)-程序员宅基地

文章浏览阅读1.1w次,点赞15次,收藏21次。我们可以用if (event->button() == Qt::LeftButton){TODO:}来判断鼠标那个键按下,但是在mouseMoveEvent函数中,event->button()总是返回NoButton,这让这个判断完全失去了意义,经查找,发现大家都是用这个if (event->buttons() & Qt::LeftButton){TODO_if(event->button()&qt::leftbutton)

python中的utils模块_使用Python的package机制如何简化utils包设计详解-程序员宅基地

文章浏览阅读423次。package 机制package是模块的集合,每一个Package的根目录下面都应当有一个__init__.py 文件。当解释器发现目录下有这个文件时,他就会认为这是一个Package,而不是一个普通的目录。对于 package 机制的说明,其实官方文档已经有非常详尽的论述了,本文并不着眼于此。简单来说,一个目录下如果包含 __init__.py ,则被 Python 视作一个 Python p..._python中from utils啥意思

外挂开发 大漠插件注册_怎么看注册大漠成功-程序员宅基地

文章浏览阅读8.5k次,点赞3次,收藏12次。在开发外挂中,其实有很多厉害的插件可以供我们使用,不再自己再去额外的写复杂的代码,类似的插件很多,比如:天使插件、DD、大漠等,各个插件都有比较擅长的功能,有些小众的插件更是给力,因为可以过NP。1.准备大漠的Dll动态链接库(里面包含了类文件)名字为:dm(mat).dll,把dm(mat).dll复制到工程的代码目录和运行目录Debug 2.添加Lib类方法:对着解决方案名..._怎么看注册大漠成功

什么是动态规划?动态规划的意义是什么?_动态规划研究意义-程序员宅基地

文章浏览阅读1.9k次。作者:王勐链接:https://www.zhihu.com/question/23995189/answer/35429905来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。动态规划的本质不在于是递推或是递归,也不需要纠结是不是内存换时间。理解动态规划并不需要数学公式介入,只是完全解释清楚需要点篇幅…首先需要明白哪些问题不是动态规划可以解决_动态规划研究意义