美文网首页
Java I/O 输入输出流(一)—— 编码问题

Java I/O 输入输出流(一)—— 编码问题

作者: itczt | 来源:发表于2019-05-18 12:23 被阅读0次

编码问题

首先我们看几个文本文件,创建了3个文本文件,它们的文件名为:“联”、“联通”、“联想”,与之对应的内容也为“联”、“联通”、“联想”。


创建完成后,我们一一打开这些文件:

我们可以看到其中的“联”、“联通”这两个文件显示乱码,其中的原因我们可以从文件当中另存为中看到:



我们从编码一栏中可以看到“联”、“联通”为“UTF-8”,“联想”为“ANSI”。
接下来我们可以通过Java来举一个案例:
我们通过解析Java的一个字符串,这个字符串里面包含中文和英文。我们把它以多种编码的方式解析成字节序列,然后和我们才去分析这个字节,这些字节序列来比较这些编码之间的区别,
我们写一个类叫EncodeDemo

EncodeDemo.Java

public class EncodeDemo throws Excepion{
   public static void main (Syring[] args){
         //我们写一个字符串
         String s = "慕课ABC";
         //将字符串转换为一个字符数组
         byte[] bytes1 = s.getBeytes(); //转换字节序列用的是默认的编码gbk。
         //接下来我们可以看一下每一个字节展现的方式。
        //把字节(转换成了int)以16进制的方式显示。
        //System.out.println(Inter.toHExString(b));
//这个地方把btye转换为int,其实就是把后8位前面添加24个0,变为4个字节,但是我们知道前面甜24个0是没有意义的,所以我们没有必要显示出来,我们可以
       System.out.print(Inter.toHExString(b & 0xff)+" ");
//b位与0xff,把前24位去掉只留后8位

我们可以看到到默认编码方式中文占2个字节,英文占一个字节。
当然我们也可以把它显示出来

        byte[] bytes2 = s.getByte("gbk");//这时会有异常产生,我们可以回避这个异常在类名后面加thows Exception
//接下来我们再来打印一下这样的字节序列,看一看结果是不是与默认的编码方式一样
         for(byte b: bytes2){ 
          System.out.print(Tnteger.toHexString(b & oxff)+"");

我们可以看到完全一模一样
这时我们得到一个结论:gbk中文占用2个字节,英文占用一个字节
刚才我们在“联”、“联通”都是一种编码叫utf-8,我们也可以进行一个转换:

     }
      System.out.println(); 
      byte[] bytes3 = s.getBytes("utf-8");
      for(byte b:bytes3){
          System.out.print(Tntger.toHexString(b & 0xff) + "");
        }


//说明:utf-8编码中文占用3个字节,英文占用一个字节

     System.out.println();
//Java是双字节编码UTF-16be
      byte[] bytes4 = s.getBytes("utf - 16be");
      for(byte b:bytes4){
          System.out.print(Integer.toHexString(b & oxff) + "");
      }
System.out.println();


有图可知:utf -16be,中文占有2个字节,英文占用2个字节。

/*当你的字节序列式某种编码时,这个时候想把字节序列变成字符串,
 *也需要用这种编码方式否则会出现乱码。
 */
     String str1 = new String(bytes4);//用项目默认的编码
     System.out.println(str1);

这个打印结果为乱码

String str2 = new String(bytes4,"utf - 16be");
System.out.println(str2);

是那种字节序列,就用那种字节序列的编码转换,就是正常的了。

/*
*文本文件,就是字节序列
*可以是任意编码的字节序列
*如果我们在中文机器上直接创建文本文件,那么文本文件只认识ANSI编码
*联通,联这是一种巧合,他们正好符合了utf-8编码的规则。
*/
   }
}

相关文章

  • Java I/O 输入输出流(一)—— 编码问题

    编码问题 首先我们看几个文本文件,创建了3个文本文件,它们的文件名为:“联”、“联通”、“联想”,与之对应的内容也...

  • Java-10 I/O流

    I/O流全称是Input/Output Stream,译为输入输出流 I/O流常用的类型都在java.io包中 类...

  • 浅谈Java中流的概念与用途

    Java所有的I/O机制都是基于数据流进行输入输出,这些数据流表示了字符或者字节数据的流动序列。Java的I/O流...

  • [Java Tutorials] 05 | Java Basic

    Basic I/O 基本输入输出 本节包含了Java平台所提供的用于基础I/O的类。首先介绍的是I/O流,一个非常...

  • JAVA基础知识之IO体系

    Java 的 I/O 类库的基本架构 I/O 问题是任何编程语言都无法回避的问题,Java中使用IO(输入输出)来...

  • Java输入输出流(一)

    Java输入输出流(一)# Android 是基于 Java 语言编写的,在安卓程序的很多时候会用到有关 I/O ...

  • java I/O输入输出流

    复习 IO ​ InputStream 所有输入字节流的基类 ​ FileInputStream(File...

  • JAVA I/O 输入输出流

    编码问题 File类的使用 RandomAccessFile类的使用 字节流 字符流 对象的序列化与反序列化

  • Java基础--I/O流

    导语: 记得刚刚学习Java I/O的时候,被输入输出流的层次结构吓得不轻,一整个流家族里面,包含了各种流类型,其...

  • Java I/O总结

    Java中I/O操作主要是指使用Java进行输入,输出操作. Java所有的I/O机制都是基于数据流进行输入输出,...

网友评论

      本文标题:Java I/O 输入输出流(一)—— 编码问题

      本文链接:https://www.haomeiwen.com/subject/gxukiqtx.html