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

相关推荐
汤姆yu2 分钟前
基于springboot的热门文创内容推荐分享系统
java·spring boot·后端
星光一影3 分钟前
教育培训机构消课管理系统智慧校园艺术舞蹈美术艺术培训班扣课时教务管理系统
java·spring boot·mysql·vue·mybatis·uniapp
lkbhua莱克瓦246 分钟前
MySQL介绍
java·开发语言·数据库·笔记·mysql
武昌库里写JAVA8 分钟前
在iview中使用upload组件上传文件之前先做其他的处理
java·vue.js·spring boot·后端·sql
董世昌4112 分钟前
什么是事件冒泡?如何阻止事件冒泡和浏览器默认事件?
java·前端
好度18 分钟前
配置java标准环境?(详细教程)
java·开发语言
teacher伟大光荣且正确23 分钟前
关于Qt QReadWriteLock(读写锁) 以及 QSettings 使用的问题
java·数据库·qt
nightseventhunit25 分钟前
base64字符串String.getByte导致OOM Requested array size exceeds VM limit
java·oom
悟能不能悟42 分钟前
java map判断是否有key,get(key)+x,否则put(key,x)的新写法
java·开发语言
webbodys1 小时前
Python文件操作与异常处理:构建健壮的应用程序
java·服务器·python