Java字符集编码解码详细介绍

news2025/1/6 20:17:56

文章目录

    • 字符集
      • 字符集的基本认识
      • 字符集编码和解码

字符集

字符集的基本认识

字符集基础知识

计算机底层不可以直接存储字符的。计算机中底层只能存储二进制(0、1)

二进制是可以转换成十进制的

计算机底层可以表示十进制编号。计算机可以给人类字符进行编号存储,这套编号规则就是字符集。

ASCII字符集:

ASCII(American Standard Code for Information Interchange,美国信息交换标准代码):包括了数字、英文、符号。

ASCII使用1个字节存储一个字符,一个字节是8位,总共可以表示128个字符信息,对于英文,数字来说是够用的。

例如:

  • 01100001‬ = 97 => a
  • ‭01100010‬ = 98 => b

GBK:

window系统默认的码表。兼容ASCII码表,也包含了几万个汉字,并支持繁体汉字以及部分日韩文字。

注意:GBK是中国的码表,一个中文以两个字节的形式存储。但不包含世界上所有国家的文字。

Unicode码表:

unicode(又称统一码、万国码、单一码)是计算机科学领域里的一项业界字符编码标准。

容纳世界上大多数国家的所有常见文字和符号。

由于Unicode会先通过UTF-8,UTF-16,以及 UTF-32的编码成二进制后再存储到计算机,其中最为常见的就是UTF-8。

注意:

Unicode是万国码,以UTF-8编码后一个中文一般以三个字节的形式存储。

UTF-8也要兼容ASCII编码表。

技术人员都应该使用UTF-8的字符集编码。

编码前和编码后的字符集需要一致,否则会出现中文乱码。

汉字存储和展示过程解析:

在这里插入图片描述

小结 :

字符串常见的字符底层组成

英文和数字等在任何国家的字符集中都占1个字节

GBK字符中一个中文字符占2个字节

UTF-8编码中一个中文1般占3个字节

字符串常见的字符底层组成要求

必须一致,否则会出现中文字符乱码

英文和数字在任何国家的编码中都不会乱码

字符集编码和解码

String编码:

方法名称说明
byte[] getBytes()使用平台的默认字符集将该String编码为一系列字节,将结果存储到新的字节数组中
byte[] getBytes(String charsetName)使用指定的字符集将该String编码为一系列字节,将结果存储到新的字节数组中

编码示例代码

public static void main(String[] args) {
    String name = "学习Java";
  
  	// 使用默认字符集(UTF-8)进行编码
    byte[] bytes = name.getBytes();
    System.out.println(Arrays.toString(bytes)); 
  	// [-27, -83, -90, -28, -71, -96, 74, 97, 118, 97]
}
public static void main(String[] args) throws UnsupportedEncodingException {
    String name = "学习Java";

  	// 指定字符集(GBK)进行编码
    byte[] bytes = name.getBytes("GBK");
    System.out.println(Arrays.toString(bytes)); // [-47, -89, -49, -80, 74, 97, 118, 97]
}

String解码:

构造器说明
String(byte[] bytes)通过使用平台的默认字符集解码指定的字节数组来构造新的 String
String(byte[] bytes, String charsetName)通过指定的字符集解码指定的字节数组来构造新的 String

解码实例代码

注意编码和解码的字符集必须一致, 否则会乱码

默认UTF-8解码

public static void main(String[] args) throws UnsupportedEncodingException {
    String name = "学习Java";

    // 编码
    byte[] bytes = name.getBytes();
    System.out.println(Arrays.toString(bytes)); // [-27, -83, -90, -28, -71, -96, 74, 97, 118, 97]

    // 解码
    String newName = new String(bytes);
    System.out.println(newName); // 学习Java
}

指定GBK解码

public static void main(String[] args) throws UnsupportedEncodingException {
    String name = "学习Java";

    // 编码
    byte[] bytes = name.getBytes("GBk");
    System.out.println(Arrays.toString(bytes)); // [-47, -89, -49, -80, 74, 97, 118, 97]

    // 解码
    String newName = new String(bytes, "GBK");
    System.out.println(newName); // 学习Java
}

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

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

相关文章

【进阶C语言】数据的存储形式

文章目录一.数据类型分类二.整形的存储形式1.源码,反码,补码的关系内存中数据的存储——二进制源码,反码,补码的关系正数负数三.大小端1.概念2.例题:判断当前编译器的存储形式四.浮点数的存储形式1.二进制的补充&#…

【k8s系列】kube-state-metrics中kube_endpoint_address指标

文章目录背景环境操作方法1:kube_endpoint_address_not_ready选择大于0的验证方式1验证方式2方法2:kube_endpoint_address_available选小于0的方法3:kube_endpoint_address{ready"false"}选大于0的解释参考author: ningan123date: …

java基础巩固-宇宙第一AiYWM:为了维持生计,架构知识+分+微序幕就此拉开之RocketM消息中间件~整起

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 RocketMQ一、RocketMQ概念~一览无余1.消息队列有啥用?能干啥?消息队列的应用场景?2.常见的消息队列有哪些?如何进行消息队列的…

2、MySQL支持的数据类型

目录 1、整数类型 (1)fillzero:根据整数类型的长度自动添加0 (2)unsigned:非负整数 (3)bin(m):将十进制数转为m进制 2、日期时间类型 &#x…

【MySQL基础教程】函数的介绍与使用

前言 本文为 【MySQL基础教程】函数的介绍与使用 相关知识,下边具体将对字符串函数,数值函数,日期函数,流程函数等进行详尽介绍~ 📌博主主页:小新要变强 的主页 👉Java全栈学习路线可参考&…

MAXHUB+腾讯会议:为未来办公造一部动力引擎

科技领域有个规律,我们经常高估一年的变化,而低估了十年或者更长时间所可能发生的变化。不信可以做个测试,你觉得未来线上办公会怎么发展?不少朋友会说,既然线上办公是疫情到来之后的PlanB,那么随着疫情结束…

【STM32F4系列】【HAL库】【自制库】ps2手柄模块驱动

外观和电气连接 外观 手柄外观如下 接收器外观 这是接收器和底座 电气连接 需要4根连接线 单片机输出是CLK DO CS 单片机输入是DI 电源电压是3.3-5v 注意模块和单片机共地 模块不支持高速,最大时钟周期约为4us左右 因此使用软件模拟时序的方式来与模块通信 只需要将模块的4根线…

Golang Context 的几种应用场景

Golang context主要用于定义超时取消,取消后续操作,在不同操作中传递值。本文通过简单易懂的示例进行说明。 超时取消 假设我们希望HTTP请求在给定时间内完成,超时自动取消。 首先定义超时上下文,设定时间返回取消函数&#xff…

Apache POI操作百万数据excel实战方案及JDK性能监控工具Jvisualvm实战

百万数据报表概述 文章目录**百万数据报表概述****1、** **概述****2、 JDK性能监控工具介绍****2.1、 Jvisualvm概述****2.2、 Jvisualvm的位置****2.3、 Jvisualvm的使用****3、** **解决方案分析****4**、**百万数据报表导出****4.1** **需求分析****4.2** **解决方案****4.…

玩转门店管理新方法,促进营收利润加倍

门店管理的好坏是门店是否可以运营下去的重要因素,决定了门店的存亡与兴衰。以往很多门店管理者为了更简单方便,采用的是传统方式进行管理。即运用手工的方式记录和计算门店的各种信息。但是随着门店规模的扩大、商品种类的丰富、客户需求的增加以及员工…

普惠微光汇聚暖阳,招联携手奋斗者筑梦前行

撰稿 | 多客 来源 | 贝多财经 近年来,受疫情反复带来的经济下行压力,收入减少生活难以保障成了社会一大难题。值此艰难时刻,一大批爱心企业出资出力,纷纷用实际行动诠释企业的使命和担当。口罩、防护服、矿泉水、食品、药物、免费…

vue配置webpack生产环境.env.production、测试环境.env.development(配置不同环境的打包访问地址)

vue-cli区分办法 vue配置生产环境.env.production、测试环境.env.development vue配置webpack生产环境、测试环境 在使用webpack创建完vue2项目的时候,为了解决生产打包、测试打包对应的全局变量不一致的问题。 首先看一下package.json的改动: "…

MARL算法系列(1):IQL【原理+代码实现】

原文题目:Multiagent cooperation and competition with deep reinforcement learning 作者:Tampuu, Ardi and Matiisen, Tambet and Kodelja, Dorian等 发表时间:2017年 主要内容:相互独立的两个DQN智能体,竞争任务下…

2022年威胁隐私和安全的数个“罪魁祸首”

随着互联网技术的不断发展,我们对网络的信任也在不断增加,甚至将自己的私人数据委托给各种在线平台,如个人数字身份信息、银行账户、各种机密信息。网络一方面的确带来变革型的进步,但另一方面,频频曝光的数据泄露事件…

VueJs中setup的使用(下)

前言在Vue当中,父组件想要向子组件传值,是通过在父组件标签上通过自定义属性实现的,而在子组件中是通过props进行接收在Vue2.0里面,在子组件中的选项式API配置项选项中props进行接收就可以了的,在子组件中的模板中可以直接使用但在Vue3里面与Vue2.0存在一些差异,这个主要是针对…

excel文件管理:如何进行密码保护和破解? 下篇

在上篇文章中,我们提到了设置工作簿的打开权限密码、修改权限密码、保护工作簿的密码、允许编辑区域的密码,并且讲到了两种破解excel密码的方式。今天,我们书接上回,继续讲解excel中常见的密码保护和破解方式,一起来看…

浅谈屏幕适配

文章目录1. 概述2. 屏幕尺寸3. 屏幕分辨率4. 屏幕像素密度5. dp、sp、px6. mdpi、hdpi、xdpi..7. 屏幕分辨率限定符8. 最小宽度限定符8.1 获取设计图最小宽度(dp)8.2 生成对应的dimens.xml文件8.3 尺寸限定符8.4 其它9. 今日头条相关9.1 系统状态栏获取不对问题9.2 autosize1. …

Elasticsearch8.X入门实战(二)Elasticsearch集群架构

Elasticsearch集群由一个或多个节点(服务器)组成,这些节点一起保存Elasticsearch的所有数据,并提供跨所有节点的联合索引和搜索功能。集群由一个唯一的名称来标识,该名称默认为“elasticsearch”(可以在配置文件中修改)。当某个节点被设置为相同的集群名称时,该节点才能…

Docker容器的简单介绍与使用

前言:大家好,我是小威,24届毕业生,曾经在某央企公司实习,目前入职某税务公司。本篇文章将记录和分享docker容器相关的知识点。 本篇文章记录的基础知识,适合在学Java的小白,也适合复习中&#x…

如何更好地进行 Android 组件化开发——路由原理篇

前言 组件化开发的会实现代码隔离,在开发时访问不到模块的代码,降低代码耦合度。那么如何跳转组件的页面、如何进行组件间的通信是个问题。这通常会使用到 ARouter、TheRouter、WMRouter 等路由框架。可能有不少人只知道怎么去调用,并不知道…