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

简介: 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多新的汉字,对于一些日常需求已经为完全够用了。


相关文章
|
1月前
|
Java
在 Java 中捕获和处理自定义异常的代码示例
本文提供了一个 Java 代码示例,展示了如何捕获和处理自定义异常。通过创建自定义异常类并使用 try-catch 语句,可以更灵活地处理程序中的错误情况。
62 1
|
26天前
|
Java
java小工具util系列4:基础工具代码(Msg、PageResult、Response、常量、枚举)
java小工具util系列4:基础工具代码(Msg、PageResult、Response、常量、枚举)
49 24
|
8天前
|
前端开发 Java 测试技术
java日常开发中如何写出优雅的好维护的代码
代码可读性太差,实际是给团队后续开发中埋坑,优化在平时,没有那个团队会说我专门给你一个月来优化之前的代码,所以在日常开发中就要多注意可读性问题,不要写出几天之后自己都看不懂的代码。
45 2
|
22天前
|
Java 编译器 数据库
Java 中的注解(Annotations):代码中的 “元数据” 魔法
Java注解是代码中的“元数据”标签,不直接参与业务逻辑,但在编译或运行时提供重要信息。本文介绍了注解的基础语法、内置注解的应用场景,以及如何自定义注解和结合AOP技术实现方法执行日志记录,展示了注解在提升代码质量、简化开发流程和增强程序功能方面的强大作用。
60 5
|
22天前
|
存储 算法 Java
Java 内存管理与优化:掌控堆与栈,雕琢高效代码
Java内存管理与优化是提升程序性能的关键。掌握堆与栈的运作机制,学习如何有效管理内存资源,雕琢出更加高效的代码,是每个Java开发者必备的技能。
48 5
|
26天前
|
Java
java 中 IO 流
Java中的IO流是用于处理输入输出操作的机制,主要包括字节流和字符流两大类。字节流以8位字节为单位处理数据,如FileInputStream和FileOutputStream;字符流以16位Unicode字符为单位,如FileReader和FileWriter。这些流提供了读写文件、网络传输等基本功能。
45 9
|
24天前
|
Java API 开发者
Java中的Lambda表达式:简洁代码的利器####
本文探讨了Java中Lambda表达式的概念、用途及其在简化代码和提高开发效率方面的显著作用。通过具体实例,展示了Lambda表达式如何在Java 8及更高版本中替代传统的匿名内部类,使代码更加简洁易读。文章还简要介绍了Lambda表达式的语法和常见用法,帮助开发者更好地理解和应用这一强大的工具。 ####
|
28天前
|
Java API Maven
商汤人像如何对接?Java代码如何写?
商汤人像如何对接?Java代码如何写?
35 5
|
29天前
|
Java
在Java中实现接口的具体代码示例
可以根据具体的需求,创建更多的类来实现这个接口,以满足不同形状的计算需求。希望这个示例对你理解在 Java 中如何实现接口有所帮助。
42 1
|
21天前
|
安全 Java API
Java中的Lambda表达式:简化代码的现代魔法
在Java 8的发布中,Lambda表达式的引入无疑是一场编程范式的革命。它不仅让代码变得更加简洁,还使得函数式编程在Java中成为可能。本文将深入探讨Lambda表达式如何改变我们编写和维护Java代码的方式,以及它是如何提升我们编码效率的。