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、使用默认的编码方式进行编码

看下面这段代码,请猜一猜数组中的元素有几个?

java 复制代码
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个字节。我们看一下运行结果

java 复制代码
[100, 107, -28, -67, -96, -27, -91, -67]

Process finished with exit code 0

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

java 复制代码
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个字节。

我们看一下运行结果

java 复制代码
[100, 107, -60, -29, -70, -61]

Process finished with exit code 0

解码

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

java 复制代码
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);
    }
}

运行结果如下:

java 复制代码
dk你好

Process finished with exit code 0

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

java 复制代码
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);
    }
}

运行结果

java 复制代码
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多新的汉字,对于一些日常需求已经为完全够用了。

相关推荐
海兰3 分钟前
使用 Spring AI 打造企业级 RAG 知识库第二部分:AI 实战
java·人工智能·spring
历程里程碑20 分钟前
二叉树---二叉树的中序遍历
java·大数据·开发语言·elasticsearch·链表·搜索引擎·lua
小信丶34 分钟前
Spring Cloud Stream EnableBinding注解详解:定义、应用场景与示例代码
java·spring boot·后端·spring
无限进步_37 分钟前
【C++】验证回文字符串:高效算法详解与优化
java·开发语言·c++·git·算法·github·visual studio
亚历克斯神38 分钟前
Spring Cloud 2026 架构演进
java·spring·微服务
七夜zippoe42 分钟前
Spring Cloud与Dubbo架构哲学对决
java·spring cloud·架构·dubbo·配置中心
海派程序猿42 分钟前
Spring Cloud Config拉取配置过慢导致服务启动延迟的优化技巧
java
阿维的博客日记1 小时前
为什么不逃逸代表不需要锁,JIT会直接删掉锁
java
William Dawson1 小时前
CAS的底层实现
java
九英里路1 小时前
cpp容器——string模拟实现
java·前端·数据结构·c++·算法·容器·字符串