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

 更新时间:2023年11月03日 11:10:59   作者:飞翔的佩奇  
最近使用Java编写一些读取文件的小工具的时候,经常与IO流打交道,但是自己对IO流的理解不是特别深刻,趁机整理下,这篇文章主要给大家介绍了关于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、GB2312GB2312编码是第一个汉字编码国家标准,于1980年由中国国家标准总局发布。其中共收录了汉字6763个。但是由于我国的汉字非常多,GB2312收录的汉字不够用了,所以GBK诞生了。GBK包含了GB2312的所有内容的同时还新增了20000多新的汉字,对于一些日常需求已经为完全够用了。

总结

到此这篇关于java中解码和编码出现乱码说明以及代码实现的文章就介绍到这了,更多相关java解码和编码乱码内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java excel转图片常用的几种方法对比及建议

    java excel转图片常用的几种方法对比及建议

    在Java开发中,借助报表插件能够轻松实现将工作表、任意指定区域以及各种形状类型转换为图片,这篇文章主要介绍了java excel转图片常用的几种方法对比及建议,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-09-09
  • Spring @Bean 修饰方法时注入参数的操作方法

    Spring @Bean 修饰方法时注入参数的操作方法

    对于 Spring 而言,IOC 容器中的 Bean 对象的创建和使用是一大重点,Spring 也为我们提供了注解方式创建 bean 对象:使用 @Bean,这篇文章主要介绍了Spring @Bean 修饰方法时如何注入参数,需要的朋友可以参考下
    2023-10-10
  • java实现多客户聊天功能

    java实现多客户聊天功能

    这篇文章主要为大家详细介绍了java实现多客户聊天功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • Redis之GEO存储地理位置信息的使用

    Redis之GEO存储地理位置信息的使用

    在外卖软件中的附近的美食店铺、外卖小哥的距离,打车软件附近的车辆,交友软件中附近的小姐姐。我们都可以利用redis的GEO地理位置计算得出。本文就来详细的介绍一下
    2021-10-10
  • Java中的BufferedInputStream与BufferedOutputStream使用示例

    Java中的BufferedInputStream与BufferedOutputStream使用示例

    BufferedInputStream和BufferedOutputStream分别继承于FilterInputStream和FilterOutputStream,代表着缓冲区的输入输出,这里我们就来看一下Java中的BufferedInputStream与BufferedOutputStream使用示例:
    2016-06-06
  • 构建Maven项目时可能遇到的问题

    构建Maven项目时可能遇到的问题

    本篇是针对构建 Maven 项目时可能出现的问题进行总结,并给出解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2026-03-03
  • JAVA把结果保留两位小数的3种方法举例

    JAVA把结果保留两位小数的3种方法举例

    在写程序的时候,有时候可能需要设置小数的位数,所以下面这篇文章主要给大家介绍了关于JAVA把结果保留两位小数的3种方法,文章通过代码介绍的非常详细,需要的朋友可以参考下
    2024-08-08
  • Java使用组件编写窗口实现网络图片显示

    Java使用组件编写窗口实现网络图片显示

    这篇文章主要为大家详细介绍了Java使用组件编写窗口实现网络图片显示的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-02-02
  • SpringBoot使用PageHelper插件实现Mybatis分页效果

    SpringBoot使用PageHelper插件实现Mybatis分页效果

    这篇文章主要介绍了SpringBoot使用PageHelper插件实现Mybatis分页效果,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作有一定的参考借鉴价值,需要的朋友可以参考下
    2024-02-02
  • IDEA启动springboot项目报missing ServletWebServerFactory错误的解决方案

    IDEA启动springboot项目报missing ServletWebServerFactory错误的解决

    Spring Boot项目在IDEA中启动时报错,经过排查发现是由于Tomcat依赖的AprLifecycleListener类未被正确加载,通过将Tomcat依赖的scope从provided改为compile,解决了问题
    2025-12-12

最新评论