解决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

智能推荐

STM32之NB-IoT学习(一)——NB-IoT介绍_物联网lot学习(2)-程序员宅基地

文章浏览阅读892次,点赞8次,收藏13次。你的支持,我的动力;祝各位前程似锦,offer不断,步步高升!!!如果你觉得这些内容对你有帮助,可以+V:Vip1104z获取!!!(备注:嵌入式)你的支持,我的动力;祝各位前程似锦,offer不断,步步高升!!!更多资料点击此处获qu!!_nb-iot

Camera Calibration and 3D Reconstruction-程序员宅基地

文章浏览阅读2.6k次。https://docs.opencv.org/2.4/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.htmlThe functions in this section use a so-called pinhole camera model. In this model, a scene view is formed..._camera calibration and 3d reconstruction

mysql 多进程 读写分离_MySQL数据库读写分离-程序员宅基地

文章浏览阅读123次。Mysql数据库读写分离一、 Mysql数据库安装(此处略过)二、 Mysql主从复制,主服务器为A:192.168.5.31,从服务器为B:192.168.5.321、 主服务器A上操作登陆mysqlMysql –u root –p授权从服务器B同步数据用户mysql> GRANT REPLICATION SLAVE ON *.* to 'slavedb'@'192.16..._数据库 多个进程读写

低代码可视化开发理念在物联网APP开发中的应用_低代码可视化平台项目理念-程序员宅基地

文章浏览阅读5k次,点赞2次,收藏44次。云编排式物联APP开发平台可通过云端可视化编排开发,边端远程自动化部署,云边协同管理运维的方式,实现物联网APP快速开发,海量边端应用管理。_低代码可视化平台项目理念

数据的两种归一化方法_数据量级相差较大 归一化-程序员宅基地

文章浏览阅读1.3k次。数据标准化(归一化)处理是数据挖掘的一项基础工作,不同评价指标往往具有不同的量纲和量纲单位,这样的情况会影响到数据分析的结果,为了消除指标之间的量纲影响,需要进行数据标准化处理,以解决数据指标之间的可比性。原始数据经过数据标准化处理后,各指标处于同一数量级,适合进行综合对比评价。一般而言,数据的标准化(normalization)是将数据按比例缩放,使之落入一个小的特定区间。在某些比较和评价的..._数据量级相差较大 归一化

立志进大厂的Owen-程序员宅基地

文章浏览阅读335次。为什么写博客?目录为什么写博客?​​​​​​​

随便推点

SpringBoot 整合RabbitMQ错误记录-程序员宅基地

文章浏览阅读336次。1. 控制台报错:Exception in thread "main" java.io.IOException…… Caused by: com.rabbitmq.client.ShutdownSignalException: connection error; protocol method: #method<connection.close>(r..._current message type not match with topic accept message types

【线性代数笔记】正交矩阵的性质-程序员宅基地

文章浏览阅读2w次,点赞16次,收藏81次。定义 设nnn阶矩阵AAA满足AAT=ATA=IAA^T=A^TA=IAAT=ATA=I,则称AAA为正交矩阵。定理1 设AAA,BBB是同阶正交矩阵,则:(1) det⁡(A)=±1\det(A)=\pm1det(A)=±1;(2) AT,A−1,A∗A^T,A^{-1},A^*AT,A−1,A∗均为正交矩阵;(3) ABABAB为正交矩阵。定理2 实方阵AAA为正交矩阵⟺\Longleftrightarrow⟺AAA的列/行向量组为标准正交向量组。证明提要:将AAA按列分块,考察ATA=I_正交矩阵的性质

AndroidStudio4.0 Layout界面预览设置等_android studio layout预览设置-程序员宅基地

文章浏览阅读3.9k次,点赞8次,收藏7次。这里写自定义目录标题AndroidStudio Layout和Drawable默认打开代码加预览AndroidStudio Layout和Drawable默认打开代码加预览AndroidStudio 3.6之后打开Layout和Drawable默认显示的只有预览页面,而不是代码加预览;选择File | Settings | Editor | Layout Editor可以修改默认显示代码加预览;直接上图:将右边Other Resources改成Split既可以实现代码加预览。效果如下:._android studio layout预览设置

<转载>Android 对sdcard操作-程序员宅基地

文章浏览阅读347次。其实就是普通的文件操作,不过还是有些地方需要注意。比如: 1.加入sdcard操作权限; 2.确认sdcard的存在; 3.不能直接在非sdcard的根目录创建文件,而是需要先创建目录,再创建文件; 在AndroidManifest.xml添加sdcard操作权限 复制代码

BDC报错信息查看-程序员宅基地

文章浏览阅读150次。3.在事务代码se91中输入对应消息类和消息编号。1.在事务代码st22的报错信息中下载本地文件。4.查看报错信息,根据报错信息取解决问题。2.打开本地文件查看报错信息。

AS 3.1.3连续依赖多个Module,导致访问不到Module中的类_为什么as在一个包下建了多个module,缺无法打开了-程序员宅基地

文章浏览阅读1.1k次。我好苦啊,半夜还在打代码。还出bug,狗日的。问题是这样的:我在新建的项目里,建了两个Module: fiora-ec和fiora-core。项目的依赖顺序是这样的,App依赖fiora-ec,fiora-ec又依赖于fiora-core,因为这种依赖关系,所有可以在app和fiora-ec中删除一些不必要的引入,比如这个玩意儿:com.android.support:appcompat-v7:..._为什么as在一个包下建了多个module,缺无法打开了

推荐文章

热门文章

相关标签