IO流:java中解码和编码出现乱码说明及代码实现

一、UTF-8和GBK编码方式

  • 如果采用的是UTF-8的编码方式,那么1个英文字母 占 1个字节,1个中文占3个字节
  • 如果采用GBK的编码方式,那么1个英文字母 占 1个字节,1个中文占2个字节

二、idea和eclipse的默认编码方式

其实idea和eclipse的默认编码方式是不一样的哦。
idea默认的编码方式是:UTF-8
在这里插入图片描述
eclipse默认采用的编码方式是GBK

三、解码和编码方法

1、java中编码的方法

  • public byte[] getBytes() 使用默认的编码方式进行编码
  • public byte[] getBytes(Charset charset) 使用指定方式进行编码

2、java中解码的方法

  • public String(byte bytes[]) 使用默认的方式进行解码
  • public String(byte bytes[], String charsetName) 使用指的方式进行解码

四、代码实现

以下代码demo均采用idea开发哦

编码

1、使用默认的编码方式进行编码
看下面这段代码,请猜一猜数组中的元素有几个?

package com.heima.demo;

import java.util.Arrays;

public class TestDemo {
    public static void main(String[] args) {
        String str = "dk你好";
        byte[] bytes = str.getBytes();
        System.out.println(Arrays.toString(bytes));
    }
}

你答对了吗?数组中一共有8个元素,因为idea默认采用的编码方式是utf-8,如果采用的是UTF-8的编码方式,那么1个英文字母 占 1个字节,1个中文占3个字节。我们看一下运行结果

[100, 107, -28, -67, -96, -27, -91, -67]

Process finished with exit code 0

如果使用指定的编码方式GBK进行编码呢?我们看一下代码

public class TestDemo {
    public static void main(String[] args) throws UnsupportedEncodingException {
        String str = "dk你好";
        byte[] bytes = str.getBytes("gbk");
        System.out.println(Arrays.toString(bytes));
    }
}

答案是:数组元素一共有6个,因为采用的是GBK编码方式,那么1个英文字母 占 1个字节,1个中文占2个字节。
我们看一下运行结果

[100, 107, -60, -29, -70, -61]

Process finished with exit code 0

解码

1、使用默认的方式进行解码

package com.heima.demo;

import java.io.UnsupportedEncodingException;

public class TestDemo {
    public static void main(String[] args) throws UnsupportedEncodingException {
        String str = "dk你好";
        byte[] byte1 = str.getBytes();
        String res1 = new String(byte1);
        System.out.println(res1);
    }
}

运行结果如下:

dk你好

Process finished with exit code 0

如果给他加上指定编码方式呢?

package com.heima.demo;

import java.io.UnsupportedEncodingException;

public class TestDemo {
    public static void main(String[] args) throws UnsupportedEncodingException {
        String str = "dk你好";
        byte[] byte1 = str.getBytes();
        String res1 = new String(byte1,"gbk");
        System.out.println(res1);
    }
}

运行结果

dk浣犲ソ

Process finished with exit code 0

我们发现有乱码产生。那为什么呢?因为编码的时候,采用的是默认的utf-8方式,所以解码的时候,也需要使用utf-8进行解码,如果使用gbk就会产生乱码。因为utf-8和gbk对中文所占的字节数是不一样的。

  • 如果采用的是UTF-8的编码方式,那么1个英文字母 占 1个字节,1个中文占3个字节
  • 如果采用GBK的编码方式,那么1个英文字母 占 1个字节,1个中文占2个字节

五、额外知识扩展

1、什么是字符集?
字符集顾名思义,就是用来装多个字符的集合。不同的字符集中字符的个数是不同的,包含的字符也是不同的,甚至对于字符的编码格式也是不同的。

2、什么是字符编码?
计算机中存储信息都是以二进制数表示的,而我们在电脑屏幕上看到的文字、数字、英文、标点符号等都是将二进制数转换过后的结果,按照某种规则,将计算机中的二进制数与某个抽象字符集合一一对应,这就是字符编码。

3、ASCII字符集
ASCII 全称 (American Standard Code for Information Interchange)美国信息交换标准代码,它是基于拉丁字母的一套电脑编码系统,其最初在创建的时候主要是为了显示英语以及一些西欧语言,是国际通用的信息交换使用标准码。ASCII使用了7位二进制来表示128个字符和符号,目前已经停止更新。

4、Unicode字符集
ASCII字符集只包含了128个字符,对于全世界的所有语言来说,并不能容纳下世界上所有的语言。所以Unicode字符集出现了。
Unicode又被称为统一码、万国码,是国际组织制定的用来容纳全世界字符的编码方案。是的,确切的说Unicode是一种编码方案,以实现跨语言、跨平台的文本处理、转换的要求。
但是Unicode只是一种字符与二进制数之间的一种逻辑映射编码,它并没有指定在计算集中应该如何的进行存储。所以此时就需要一种编码格式用来指定Unicode字符集中的字符是如何进行编码的。
在Unicode官方资料中,Unicode编码方式有三种:UTF-8、UTF-16、UTF-32,而其中UTF-8编码成为了现今互联网使用较多的编码方式。

5、GB2312
GB2312编码是第一个汉字编码国家标准,于1980年由中国国家标准总局发布。其中共收录了汉字6763个。但是由于我国的汉字非常多,GB2312收录的汉字不够用了,所以GBK诞生了。GBK包含了GB2312的所有内容的同时还新增了20000多新的汉字,对于一些日常需求已经为完全够用了。

  • 38
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 41
    评论
### 回答1: 要将Java的FileInputStream转换为InputStreamReader,可以使用InputStreamReader的构造函数,该构造函数接受InputStream和Charset作为参数。因此,可以使用以下代码: ``` FileInputStream fileInputStream = new FileInputStream("example.txt"); InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream, StandardCharsets.UTF_8); ``` 这将创建一个InputStreamReader对象,它使用UTF-8字符集读取名为"example.txt"的文件。现在,您可以使用inputStreamReader对象来读取该文件。 ### 回答2: 要将FileInputStream转换为InputStreamReader,可以使用以下代码: ```java // 创建一个FileInputStream对象 FileInputStream fis = new FileInputStream("input.txt"); // 将FileInputStream对象转换为InputStreamReader对象 InputStreamReader isr = new InputStreamReader(fis); ``` - 首先,我们创建一个FileInputStream对象,指定要读取的文件路径。这个对象将用于读取文件的字节。 - 然后,我们通过创建InputStreamReader对象,将FileInputStream对象转换为字符。InputStreamReader是一个字节和字符之间的桥梁。它将字节转换为字符,使用指定的字符编码。 需要注意的是,在转换过程,字符编码是非常重要的。如果不指定字符编码,默认会使用平台默认的字符编码。如果文件的字符编码与平台默认的字符编码不一致,可能会导致码问题。因此,根据实际情况,需要指定正确的字符编码,例如: ```java // 使用UTF-8编码 InputStreamReader isr = new InputStreamReader(fis, "UTF-8"); ``` 完成上述转换后,我们就可以使用InputStreamReader对象来读取文件的字符数据了。 ### 回答3: 在Java语言,可以使用IO的知识将FileInputStream转换为InputStreamReader。 首先,我们需要引入相应的包: import java.io.FileInputStream; import java.io.InputStreamReader; import java.io.IOException; import java.io.UnsupportedEncodingException; 然后,创建一个FileInputStream对象,用于读取文件的原始字节: FileInputStream fis = new FileInputStream("文件路径"); 接下来,我们可以将FileInputStream对象转换为InputStreamReader对象,使用特定的字符编码进行解码。常见的字符编码包括UTF-8、GBK等: InputStreamReader isr = new InputStreamReader(fis, "字符编码"); 最后,通过InputStreamReader对象,我们可以读取文本内容。可以使用read()方法逐个字符地读取,或者使用readLine()方法逐行读取: int data = isr.read(); String line = isr.readLine(); 需要注意的是,在使用完InputStreamReader后,我们需要关闭它以确保资源的释放: isr.close(); fis.close(); 使用以上的方法,我们就可以将FileInputStream转换为InputStreamReader,并且可以方便地读取文本内容了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 41
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

飞翔的佩奇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值