• 字符串转码中文乱码问题的进一步理解 UTF-8 GBK转码


                首先 要明确指出一点:

                       编码方式是针对字符串转换之后的字节数组的,字符串并没有编码方式的概念,因为字符串不管是在什么编码页面下他只是一个对象,他只有字符的概念,不管页面编码方式是什么,他始终都是那几个字符    

                    众所周知,字符编码很多  像UTF-8、GBK、GB2312、ISO8859-1等等  其中GBK是兼容GB2312的 

      重点是UTF-8编码下的中文占3个字节GBK、GB2312编码下的中文占2个字节,当我们把一个字符串解析为UTF-8的字节时,

      如果进行了业务处理,再转为GBK那么很容易就出现了乱码,很显然两种编码中文字节占用位数都不一样,

        网上很多人说GBK转UTF-8的方法如下:

    //以下代码是错误的   
    String str="双节棍爱好友h为太原"; byte[]tem=str.getBytes("GBK"); String result=new String(tem,"UTF-8");

           我可以很负责的说这个是错误的  结果是乱码 这个我已经试过 是错误的

         字符串就是个对象 你用什么编码去获取字节数组,那么你将字节数组重新还原字符串的时候就用对应的编码

    //正确的方式
    String name="金黄色的sfdf弗兰克的但safd撒酒疯"; byte[] gbkBytes=name.getBytes("GBK"); System.out.println(new String(gbkBytes,"GBK")); byte[] utfBytes=name.getBytes("UTF-8"); System.out.println(new String(utfBytes,"UTF-8"));

    如果要把字符串转换为UTF-8的字节数组  可以用以下两种方法:

    byte[] retString=name.getBytes("UTF-8");

    或者:

    public static byte[] getUTF8Bytes(String name) {
            int n = name.length();
            byte[] utfBytes = new byte[3 * n];
            int k = 0;
            for (int i = 0; i < n; i++) {
                int m = name.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;
        }

        严禁盗版    

       转载请注明出处:https://www.cnblogs.com/bimingcong/p/9185472.html



  • 相关阅读:
    JqueryDataTable的使用(.Net平台)
    MvcPager使用的Demo(同步分页)
    第一篇随笔
    基于querybuilder的可根据现有数据表自动生成Restful API的dotnet中间件
    EF Core懒人小技巧之拒绝DbSet
    【基于EF Core的Code First模式的DotNetCore快速开发框架】完成对DB First代码生成的支持
    基于EF Core的Code First模式的DotNetCore快速开发框架
    Service Fabric独立集群搭建
    Win10打补丁KB4022725出现0x80073712错误
    【懒人有道】在asp.net core中实现程序集注入
  • 原文地址:https://www.cnblogs.com/bimingcong/p/9185472.html
Copyright © 2020-2023  润新知