zoukankan      html  css  js  c++  java
  • Java 字符转码之UTF-8转为GBK/GB2312

    java跟python类似的做法,在java中字符串的编码是java修改过的一种Unicode编码,所以看到java中的字符串,心理要默念这个东西是java修改过的一种Unicode编码的编码。

    package string;
    
    import java.nio.charset.Charset;
    
    
    public class UTF82GBK {
    
        public static void main(String[] args) throws Exception {
            //系统的默认编码是GBK
            System.out.println("Default Charset=" + Charset.defaultCharset());
            String t = "hfjkds中国中国中国中国中国中国中国中国中国中国中国中国中国中国中国中国中国中国中国中国hfsdkj<img src='sasa' /> fjldsajflkdsjaflkdsjalf <img src='sada' ait=''/>sfdsfadas";  
            //思路:先转为Unicode,然后转为GBK
            String utf8 = new String(t.getBytes( "UTF-8"));
            //等同于:
    //        String utf8 = new String(t.getBytes( "UTF-8"),Charset.defaultCharset());
            
            System.out.println(utf8);  
            String unicode = new String(utf8.getBytes(),"UTF-8");   
            //等同于:
    //        String unicode = new String(utf8.getBytes(Charset.defaultCharset()),"UTF-8");   
            System.out.println(unicode);  
            String gbk = new String(unicode.getBytes("GBK"));  
            //等同于:
    //        String gbk = new String(unicode.getBytes("GBK"),Charset.defaultCharset());  
              
            System.out.println(gbk);  
        }
    
    }
    package com.mkyong;
     
    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.InputStreamReader;
     
    public class UTF8ToGBK {
        public static void main(String[] args) throws Exception {
     
            File fileDir = new File("/home/user/Desktop/Unsaved Document 1");
     
            BufferedReader in = new BufferedReader(new InputStreamReader(
                    new FileInputStream(fileDir), "UTF-8"));
     
            String str;
     
            while ((str = in.readLine()) != null) {
                System.out.println(str);// java内部只有unicode编码 所以str是unicode编码
                String str2 = new String(str.getBytes("GBK"), "GBK");// str.getBytes("GBK")是gbk编码,但是str2是unicode编码
                System.out.println(str2);
            }
     
            in.close();
        }
    }

     问题的关键是new String(xxx.getBytes("gbk"), "gbk")这句话是什么意思,xxx.getBytes("gbk")得到的数组编码是GBK,因此必须必须告诉java:我传给你的数组是gbk编码的,你在转换成你内部的编码的时候记得要进行一些处理,new String(xxx.getBytes("gbk"), "gbk"),这句话第二个“gbk”是告诉java传递给它的是gbk编码的字符串。

    String fullStr = new String(str.getBytes("UTF-8"), "UTF-8");//正常
    String fullStr2 = new String(str.getBytes("UTF-8"), "GBK");//不正常,java内置的编码->utf8  被当成GBK编码转换成java内置的编码

    看一下jdk文档是怎么说的

    public String(byte[] bytes,
          Charset charset)

    Constructs a new String by decoding the specified array of bytes using the specified charset.

    那现在的问题就是,我怎么在String中持有GBK编码的东西呢?

    String str3 = new String(str.getBytes("GBK"),"ISO-8859-1");
    System.out.println(new String(str3.getBytes("ISO-8859-1"),"GBK"));
  • 相关阅读:
    联想 Vibe Shot(Z90-3) 免recovery 获取ROOT权限 救砖 VIBEUI V3.1_1625
    联想 Z5S(L78071)免解锁BL 免rec 保留数据 ROOT Magisk Xposed 救砖 ZUI 10.5.370
    联想 Z5(L78011) 免解锁BL 免rec 保留数据 ROOT Magisk Xposed 救砖 ZUI 10.5.254
    联想 S5 Pro(L78041)免解锁BL 免rec 保留数据 ROOT Magisk Xposed 救砖 ZUI 5.0.123
    第二阶段 冲刺八
    第二阶段 冲刺七
    第二阶段 冲刺六
    第二阶段 冲刺五
    代码大全阅读笔记03
    学习进度十二
  • 原文地址:https://www.cnblogs.com/ghgyj/p/4020879.html
Copyright © 2011-2022 走看看