【Java IO流】字符集使用详解

news2024/11/14 14:53:46

文章目录

  • 前言
  • ASCII
  • GBK
  • Unicode
  • 为什么会出现乱码

前言

上一节关于字节流的文章中,在使用字节流读取本地文件中的数据时,文件中只存放了英文,而并没有存放中文数据。我们还提到了不建议使用字节流读取纯文本文件的数据,否则会出现乱码的情况,那么,为什么会出现这样的情况呢?相信探讨完今天的内容,你会有新的理解。

在计算机中,任何数据都是以二进制的形式存储的,一位二进制数称为一个比特位,一个字节由 8 位二进制数组成,存放 2 的 8 次方个数据,字节是计算机中最小的存储单元

而英文存放数据只需要一个字节即可,为什么呢?这就需要我们学习字符集的知识,字符集也叫作编码表,例如 ASCII 字符集,把一些常用的字符编写为一个表,每个字符对应了一个整数值,ASCII 表中一共 128 个数据,其中英文就全部包括在其中,所以说,存放英文数据至于要一个字节即可。

目前的文字编码标准主要有 ASCII、GB2312、GBK、Unicode 等。ASCII 编码是最简单的西文编码方案。GB2312、GBK、GB18030 是汉字字符编码方案的国家标准。Unicode 是全球字符编码的国际标准 。

ASCII

计算机以二进制的形式存储数据,例如 a,b,c 这样的字符和 1,2,3 这样的数字以及 + ,-,* 等这样的符号都是使用二进制在计算机中存储的,但是具体哪个二进制数字代表了哪个字符没有统一的标准,此时就需要规定一个标准,于是产生了 ASCII 字符集。ASCII 字符集由美国相关组织规定,其中共有 128 个数据。

详细的信息可以查看 ASCII 码表,常用的字符有 48 到 57 是十个阿拉伯数字,65 到 90 是 26 个大写英文字母,97 到 122 是小写英文字母。

在字符集中查询到的数据不会直接存储到计算机中,这里涉及到编码和解码的概念,编码就是把字符集中查询到的数据按照一定的规则进行计算,变成真实的存储在计算机硬盘中的二进制数据的过程,解码就是把实际存储在计算机中的二进制数据按照一定的规则进行计算,变成字符集中的数值的过程。ASCII字符集编码就是直接在前面补 0 ,解码时直接转换为十进制。

下面表示的是计算机的存储规则:

image-20230116194850128
ASCII 表中只包含了一些欧洲国家常用的字符,并没有包含汉字。我们国家在1980年发布了 GB2312(国标)字符集,其中包含了常用图形字符和简体中文,台湾地区发布了繁体中文字符集 BIG5 ,为了统一标准,2000年我国发布了 GBK 字符集,包含了常用的中日韩文字等。随着计算机的发展,又出现了 Unicode 字符集,他将世界每个语言的字符集定义了一个唯一的编码。

我们使用的简体中文版 Windows 系统默认使用 GBK 字符集,不同的 Windows 使用不同版本的字符集,统一称为 ANSI 。

GBK

我们主要学习英文和汉字是如何使用字符集在计算机中存储数据的。

在 GBK 中,英问同样使用一个字节存储,因为它完全兼容 ASCII 字符集,在存储时编码规则与 ASCII 相同:

image-20230116200359193

在 GBK 字符集中,汉字使用两个字节存储,因为一个字节最多存储 256 个数据显然是不够的。GBK字符集中,左边 8 位称为高位字节,右边 8 为称为低位字节,高位字节转为十进制必须是一个负数,且高位字节第一个二进制数一定是 1 ,这样做是为了区分汉字和英文,在读取数据时,当出现 1 时,计算机会认为读取到了汉字,此时会把两个字符的数据解码为一个汉字。

image-20230116201545704

Unicode

不同的国家使用不同的字符集显然是不利于软件的发展的,为了统一规则,出现了 Unicode 字符集。Unicode 字符集由世界各地的软件开发商,电脑制造商等组成的统一码联盟制定的。

同样的,Unicode 完全兼容 ASCII 字符集,但是其编码规则有所不同。例如 UTF-16(使用 2-4 个字节),UTF-32(固定使用 4 个字节),UTF-8等,其中 UTF-8 是我们实际开发中常用的编码方式,其使用 1 到 4 个字节的可变字符编码。

在 UTF-8 字符编码规则中,ASCII字符集中的字符使用 1 个字节存储,中日韩文字等使用 3 个字节存储,其具以下的规则:

image-20230116204529634

例如 “汉” 字,在 Unicode 字符集中是 47802,转化为二进制是1011101010111010,其进行 UTF-8 编码以后是:

11101011 1010101010 10111010

为什么会出现乱码

在 Java 中程序出现乱码可能是下面的问题导致的:

  1. 读取数据时,未读完整个汉字
  2. 编码方式和解码方式不统一

我们知道使用字节流读取数据时,默认一次只能读取一个字节的数据,而 UTF-8 编码方式中使用三个字节存储一个汉字,此时就可能出现没有读完整个汉字的情况,于是就出现了乱码。

编码方式和解码方式不同时也会出现乱码。例如存储一个汉字时,使用 UTF-8 的方式编,计算机会使用 3 个字节存储该数据,如果此时使用 GBK 的方式解码,就会出现乱码的情况。

所以,为了避免出现乱码,我们不能使用字节流读取文本文件,并且要保证编码和解码的方式统一。回到前言中的问题,现在我们已经不难理解。

Java 中使用以下的方法进行编码和解码:

import java.util.Arrays;

public class Test {
    public static void main(String[] args) {
        /*
        编码和解码的使用
         */
        String s="Java你好";
        byte[] bytes = s.getBytes();
        System.out.println(Arrays.toString(bytes));

        String s2=new String(bytes);
        System.out.println(s2);
    }
}

此时,Java 使用 IDE 默认的编码方式进行编码,我们还可以使用 getBytes() 方法的重载方法指定编码方式,使用指定编码方式编码时可能会出现异常,抛出即可。如果编码和解码的方式不统一,会出现乱码。

示例:

import java.io.UnsupportedEncodingException;
import java.util.Arrays;

public class Test {
    public static void main(String[] args) throws UnsupportedEncodingException {
        String s="Java你好";
        byte[] bytes = s.getBytes("GBK");
        System.out.println(Arrays.toString(bytes));

        String s2=new String(bytes);
        System.out.println(s2);
    }
}

我们指定了字符串使用 GBK 的方式编码,当使用默认的 UTF-8 再次解码时,控制台出现乱码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/172207.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Elasticsearch7.8.0版本高级查询—— 匹配查询文档

目录一、初始化文档数据二、匹配查询文档示例2.1、概述2.2、示例一、初始化文档数据 在 Postman 中,向 ES 服务器发 POST 请求 :http://localhost:9200/user/_doc/1,请求体内容为: {"name":"张三","age&…

浅谈php原生类的利用 2(ErrorSoapClientSimpleXMLElement)

除了上篇文章浅谈 php原生类的利用 1(文件操作类)_php spl原生类_葫芦娃42的博客-CSDN博客 里提到的原生利用文件操作类读文件的功能,在CTF题目中,还可以利用php原生类来进行XSS,反序列化,SSRF,XXE。 常用内置类: Dire…

【SAP Abap】X档案:SAP Native SQL 简介及实现方式(EXEC SQL、ADBC、AMDP)

SAP Native SQL 简介及实现方式(EXEC SQL、ADBC、AMDP)1、SAP Open SQL 与 Native SQL 的特点2、Native SQL 的实现方式方式一:Exec SQL(1)获取单值(2)获取多行(3)游标应…

TCP协议的长连接和短连接详解

一 前言TCP在真正开始进行数据传输之前,Server 和 Client 之间必须建立一个连接。当数据传输完成后,双方不再需要这个连接时,就可以释放这个连接。TCP连接的建立是通过三次握手,而连接的释放是通过四次挥手。所以说,每…

【SpringCloud】Eureka的基本原理与使用

【SpringCloud】Eureka的基本原理与使用 一、Eureka-提供者与消费者 【问】如果服务A调用了服务B,而服务B又调用了服务C,服务B的角色是什么? 二、Eureka的结构和作用 什么是Eureka? Eureka 解决服务调用的问题 order-servic…

博物馆3d数字化全景展示设计方案

作为近几年新兴的营销方式,交互式营销能够让消费者对产品从主动感兴趣到互动体验,甚至自主自发传播,达到“在销售中传播,在传播中销售”的目的。进入数字体验经济时代,当3d数字化展示技术遇上传统行业,3d数…

Redis原理篇(三)通信协议

一、RESP协议 1、定义 Redis是一个cs架构的软件,通信一般分两步: 客户端client向服务端server发送一条命令服务端解析并执行命令,返回响应结果给客户端 因此客户端发送命令的格式、服务端响应结果的格式必须有一个规范,这个规…

HashMap源码学习:JDK1.8版本源码解析

文章导航 HashMap源码学习:红黑树原理详解 HashMap源码学习:JDK1.8版本源码解析 目录文章导航前言正文HashMap重要属性HashMap构造方法HashMap扩容方法HashMap链表迁移HashMap红黑树迁移HashMap链表转红黑树HashMap红黑树转链表HashMap添加数据HashMap移…

让你彻底明白Java SPI与SpringBoot自动配置,内附实例代码演示

一、Java SPI的概念和术语 SPI:全称是Service Provider Interface:是一种基于ClassLoader来发现并加载服务的机制 SPI由三个组件构成:Service、Service Provider、ServiceLoader Service:是一个公开的接口或抽象类,定…

数说菊风2022

春风传捷报, 梅韵贺新年! 2022,已悄然划过, 就让我们用数字说话, 述说这年的精彩! 树十大标杆案例 国际运营商战略合作——Telkomsel 携手印尼运营商Telkomsel在RCS融合通信和RTC实时音视频领域形成合…

golang入门笔记——kitex

WSL的安装 由于Kitex并不支持Linux,所以需要首先安装WSL2 WSL一句话来说就是微软出的一个虚拟机工具 Win11下安装WSL2的步骤为: 1.“开始菜单”搜索功能,打开“启动或关闭Window功能” 2.勾选以下功能 1.适用于Linux的Window子系统 2.虚…

qsort函数

目录1.什么是qsort函数2.实现一个qsort函数3.用qsort函数排序一个结构体4.模仿qsort的功能实现一个通用的冒泡排序1.什么是qsort函数 我们以前学习过的一些排序算法,如冒泡、希尔、快排等等,它们速度有快有满,但是这些排序都只能排序一种类型…

iOS 内存泄漏检测 Instruments Leaks

Xcode 中 按住 command I 或者菜单栏 Product – Profile 2. 双击 Leaks 或者按 choose,打开 Leaks 面板 3. 在显示的 Leaks 面板中,点击左上角红色点,即可运行内存检测。 4. 在运行过程中如果发现Leak Checks(如图)…

【C进阶】C进阶练习编程题

⭐博客主页:️CS semi主页 ⭐欢迎关注:点赞收藏留言 ⭐系列专栏:C语言进阶 ⭐代码仓库:C Advanced 家人们更新不易,你们的点赞和关注对我而言十分重要,友友们麻烦多多点赞+关注,你们…

关闭“此版本的Windows不再支持Microsoft Edge”提示

在Win7中,安装Microsoft Edge,升级到“109.0.1518.55 (正式版本)”后,打开Edge会弹出提示: 此版本的 Windows 不再支持 Microsoft Edge。升级到 Windows 10 或更高版本,以从 Microsoft Edge 获取常规功能和安全更新。 …

ESPNet: 自动驾驶领域轻量级分割模型

论文标题:ESPNet: Efficient Spatial Pyramid of Dilated Convolutions for Semantic Segmentation 论文地址:https://arxiv.org/pdf/1803.06815v2.pdf 开源地址: https://github.com/sacmehta/ESPNet 论文思想 ESPNet是用于语义分割的轻量…

一文弄懂Linux虚拟机网络配置

文章目录计算机网路基础网络连接模式Bridged(桥接模式)NAT(地址转换模式)Host-Only(仅主机模式)Linux常用网络相关命令ifconfig:配置网络接口ping:测试主机之间网络连通性修改ip地址…

Threejs 导入动态模型 - 兔子岛

Threejs 动画模型GLTF加载器(GLTFLoader) glTF(gl传输格式)是一种开放格式的规范 (open format specification), 用于更高效地传输、加载3D内容。该类文件以JSON(.gltf)…

产品心理学:福格行为模型详解与应用

​Fogg说人的行为由动机,能力和触发条件这三要素组成,这三个同时都满足时行为才会发生。用一个等式来简化就是: BMAT 其中B是Behavior行为,M是Motivation 动机,A是Ability能力,T是Triggers触发。 行为的发…

“华为杯”研究生数学建模竞赛2004年-【华为杯】B题:实用下料的数学模型(附优秀论文)

赛题描述 “下料问题(cutting stock problem)”是把相同形状的一些原材料分割加工成若干个不同规格大小的零件的问题,此类问题在工程技术和工业生产中有着重要和广泛的应用. 这里的“实用下料问题”则是在某企业的实际条件限制下的单一材料的下料问题。 一个好的下料方案首先…