Java 中 char 和 Unicode、UTF-8、UTF-16、ASCII、GBK 的关系

news2025/1/18 2:03:07

Unicode、UTF-8、UTF-16、UTF-32、ASCII、GBK、GB2312、ISO-8859-1 它们之间是什么关系?

关于这几种字符编码的关系,经过各种资料研究,总结如下图(请右键在新标签页打开查看或者下载后使用看图工具放大查看):

在这里插入图片描述

我们应该从历史的顺序看待这些字符编码的由来:

  • ASCII(早期):早期提出的一种字符编码集,总共有 128 个字符,可以用 1 个字节 8 个比特位的低 7 位表示,也可以用十进制数字:[0-127]每个数字表示一个字符。全部的ASCII码参考这里。
  • ISO-8859-1:256 个字符编码,西欧语言对 ASCII 码的扩展。
  • GB2312:汉字编码集,对 ASCII 的扩展。采用双字节表示编码范围:A1-F7,其中从A1-A9是符号区,总共包含 682 个符号,6763 个汉字。
  • GBK:主要针对 GB2312 的扩展,采用双字节表示编码范围:[8140,FEFE](剔除XX7F) 共 23940 个码位,共收录了 21003 个汉字。一个中文字符占2个字节GBKUnicode 是完全不同的两种编码形式,没有转换规则,互相之间的转换只能通过查表。
  • Unicode(现代):对 ASCII 的扩展,一种规模巨大的字符编码集,可容纳100多万种符号,包括了地球上所有文化、所有字母和符号的编码。每一种编码对应了一个字符, Unicode 采用 4~6HEX 码表示一个 Unicode 码点,范围是[U+0000~U+10FFFF],目前仍在更新中。

由于 Unicode 只规定了表示符号的二进制代码,却没有规定如何存储这个二进制代码。所以如何存储 Unicode 有不同的实现。而 UTF-8UTF-16UTF-32 就是针对 Unicode 的不同存储方式的具体实现。

  • UTF-8可变长编码,可以使用 1~4 个字节表示一个符号,根据不同符号而变化。为了解决 Unicode 如何在网络上传输,互联网上使用最最广泛。在这种编码下,例如一个中文字符占 3 个字节,一个英文字符占 1 个字节,一个 Emoji 表情符号占用 4 个字节,所以说它是变长的。UnicodeUTF-8 编码之间需要经过转换,加密/解密。UTF-8Unicode 中的第0-127位字符使用 1 个字节表示,和 ASCII 编码相同,从128号开始的字符使用234位字节来表示。一个字节就是一个代码单元(code unit),一个代码点(code point)可能由1-4个代码单元组成。
  • UTF-16可变长编码,一个字符使用使用 2 个或者 4 个字节来存储。在 Java 中的字符编码实现就是采用 UTF-16 编码,一个 char 占用 2 个字节,这意味着 Java 中的一个 char 只能表示0000~FFFF的范围的 Unicode 字符,而对于10000~10FFFF范围的 Unicode 字符则需要用两个 char 才能表示(使用一个String)。(如果是前者范围二者不需要编码转换,如果是后者范围二者需要编码转换)
  • UTF-32定长编码,一个字符采用 4 个字节存储。由于 4 字节表示的范围完全容纳了 Unicode 范围,所以 UTF-32Unicode 之间不需要转换,而 UTF-8UTF-16Unicode 之间都是需要经过转换的

注意:很多资料和文章中将 UTF-8 和 UTF-16 都称为定长编码,但实际上它们是可变长编码的,例如一个中文汉字用 UTF-8 表示的话,就需要 3 个字节。

Java 中 char 的字符编码

Java语言规范规定: Java 的 char 类型是 UTF-16 的 code unit,占用 2 字节(也就是16位),然后字符串是 UTF-16 code unit 的序列。

UTF-16 是一种存储 Unicode 编码的具体实现,Unicode 是字符集,和 ASCII 码一样,

下表是 Java 中的 char 表示不同字符集时的区别:

在这里插入图片描述

Java 中可以使用如下代码打印一个中文汉字的16进制表示:

char c = '中';
System.out.println(Integer.toHexString(c));  // 4e2d

输出是 4e2d,这表明 Java 中使用char表示一个字符确实是占 2 个字节。

在这里插入图片描述

而对于表情符号,它需要占用 4 个字节,所以在 Java 中你是无法使用一个char来表示一个表情符号的,如果你尝试这么做会得到一个类似下面这样的编译器报错提示:

在这里插入图片描述

如何打印这个表情符号的十六进制编码呢?既然char存不下,只能使用String来存储了,我们可以使用 String.getBytes() 方法指定编码字符集来输出对应的bytes数组,例如对于汉字“中”我们可以这样打印:

try {
   
     byte[] bytes = "中".getBytes("UTF-16");
     System.out.println(bytes.length);
     for (byte b : bytes) {
   
        	int temp = b & 0xFF; // 取低8位,即1个字节
            System.out.print(String.format("%02X", temp));
            System.out.print(" "); 
       }
     System.out.println();
 } catch (UnsupportedEncodingException e) {
   
 }

输出:

4
FE FF 4E 2D 

对于表情符号类似的:

try {
   
     byte[] bytes = 

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

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

相关文章

【MySQL】:数据库基本认识

数据库基础 一.什么是数据库1.mysql是什么2.为什么要有数据库3.服务器,数据库,表关系4.Mysql架构5.SQL语句分类 二.存储引擎 一.什么是数据库 1.mysql是什么 1.mysql是数据库服务的客户端。 2.mysqld是数据库服务的服务器端。 3.mysql本质:基…

Python 从入门到精通 学习笔记 Day01

Python 从入门到精通 第一天 今日目标 计算机组成原理、编程语言、Python环境安装 第一个Python程序、PyCharm的安装与使用 Python的基础语法、Python的基本数据类型 一、计算机组成原理 计算机的组成 计算机硬件通常由以下几个部分组成: 1.中央处理器(CPU):负责执行计算机…

红队专题-开源资产扫描系统-ARL资产灯塔系统

ARL资产灯塔系统 安装说明问题 : 安装说明 源码地址 https://github.com/TophantTechnology/ARL https://github.com/TophantTechnology/ARL/wiki/Docker-%E7%8E%AF%E5%A2%83%E5%AE%89%E8%A3%85-ARL 安装环境 uname -a Linux VM-24-12-centos 3.10.0-1160.49.1.e…

02Docker容器卷

Docker容器卷 1.数据卷是什么 简而言之: 就是Docker用来存储数据的,在镜像被删除的时候,卷中数据不会被删除,就是相当于一个数据库备份数据,相当于Windows中的目录或文件 2.目的 解决数据持久化 独立容器的生存周期,帮助容器间继承和共享数据 3.数据卷的使用 1.直接添加 doc…

sed 流式编辑器

使用方式: 1,前置指令 | sed 选项 定址符指令 2,sed 选项 定址符指令 被处理文档 选项: -n 屏蔽默认输出 -i写入文件 -r支持扩展正则 指令: p输出 d删除 s替换 sed -n 1p user //输出第1行 sed -n…

从Excel中找sheet

pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 …

ambari 开启hdfs回收站机制

hdfs回收站类似于我们常用的windows中的回收站&#xff0c;被删除的文件会被暂时存储于此&#xff0c;和回收站相关的参数有两个&#xff1a; fs.trash.interval&#xff1a;默认值为0 代表禁用回收站&#xff0c;其他值为回收站保存文件时间&#xff0c;单位为分钟 fs.trash…

如何评估数据资产的价值?哪种方法更容易实现?

今年可以称之为数据年&#xff0c;从去年年底党中央发布《数据20条》&#xff0c;对数据领域的一系列的制度建设做了提纲起领的作用。在财经领域今年的下半年&#xff0c;密集出台一系列跟数据资产相关的政策&#xff0c;包括8月21日发布的《企业数据资源会计处理的暂行规定》以…

Element-ui框架完成vue2项目的vuex的增删改查

看效果图是否是你需要的 这是原来没有Element-ui框架的 首先&#xff0c;你要在你的项目里安装Element-ui yarn命令 yarn add element-uinpm命令 npm install element-ui --save好了现在可以粘贴代码 //main.js import Vue from vue import Vuex from vuex import VueRouter …

如何使用 Zotero 导出所选条目的 PDF 文件

如何使用 Zotero 导出所选条目的 PDF 文件 Zotero 是一款强大的参考文献管理工具&#xff0c;但它并不直接提供将整个文件夹导出为 PDF 的选项。不过&#xff0c;您可以使用以下步骤来导出您所选的 Zotero 条目中的 PDF 文件&#xff0c;无需额外的插件。 选择所需的 Zotero 条…

Linux(centos)学习笔记(初学)

[rootlocalhost~]#:[用户名主机名 当前所在目录]#超级管理员标识 $普通用户的标识 Ctrlshift放大终端字体 Ctrl缩小终端字体 Tab可以补全命令 Ctrlshiftc/V复制粘贴 / &#xff1a;根目录&#xff0c;Linux系统起点 ls&#xff1a; #list列出目录的内容&#xff0c;通常用户查看…

【网络奇缘】- 计算机网络|深入学习物理层|网络安全

​ &#x1f308;个人主页: Aileen_0v0&#x1f525;系列专栏: 一见倾心,再见倾城 --- 计算机网络~&#x1f4ab;个人格言:"没有罗马,那就自己创造罗马~" 回顾链接&#xff1a;http://t.csdnimg.cn/ZvPOS 这篇文章是关于深入学习原理参考模型-物理层的相关知识点&…

2023年山东省职业院校技能大赛信息安全管理与评估二三阶段样题

2023年山东省职业院校技能大赛信息安全管理与评估二三阶段 样题 第二阶段 模块二 网络安全事件响应、数字取证调查、应用程序安全 一、竞赛内容 Geek极安云科专注技能竞赛技术提升&#xff0c;基于各大赛项提供全面的系统性培训&#xff0c;拥有完整的培训体系。团队拥有曾…

4.Java程序设计-基于springboot得在线考试系统

编程技术交流、源码分享、模板分享、网课分享 企鹅&#x1f427;裙&#xff1a;772162324 摘要&#xff1a; 本文设计并实现了一款基于Spring Boot框架的在线考试系统小程序。随着远程学习和在线教育的普及&#xff0c;对于灵活、便捷的在线考试系统的需求逐渐增加。该小程序…

【CentOS8】使用 Tomcat 部署 Java Web 项目(使用 sdkman)

文章目录 配置 Tomcat将 Tomcat 启动命令设置为 Linux 自定义服务给 Tomcat 设置管理员账号密码IDEA 打包 Java web 项目 我是使用 sdkman 下载的 jdk 和 tomcat&#xff0c;所以接下来的部署配置都是在 sdkman 构建的环境的。想要知道如何下载 sdkman 可以看看这篇文章 —…

Qt创建和使用动态库链接

首先建立库文件 顺序确认完成后&#xff0c;构建完成 注意&#xff1a;上图中mydll_global.h中的内容可以复制到mydll.h中去&#xff0c;在以后调用时只调用mydll.h即可&#xff0c;否则调用时需要两个头文件同事使用。 在mydll.h和mydll.cpp中可以正常编写代码&#xff…

硬件工程师-实践次数决定创造力

硬件工程师 理论基础决定理解力 实践次数决定创造力 文章目录 硬件工程师前言一、硬件工程师必备技能二、硬件工程师的开发项目有哪些1. 单片机和嵌入式系统设计2. FPGA&#xff08;现场可编程门阵列&#xff09;设计3. PCB&#xff08;印刷电路板&#xff09;设计与布局4. 电路…

linux逻辑卷LVM

6.2.6 逻辑卷LVM LVM是Logical Volume Manager 的简称&#xff0c;译为逻辑卷管理&#xff0c;它是Linux下对硬盘分区的一种管理机制。LVM适合于管理大存储设备&#xff0c;并允许用户动态调整文件系统的大小。此外&#xff0c;LVM的快照功能可以帮助我们快速备份数据。LVM为我…

云服务器与nas实现在冷热资源访问,nginx代理

在实际项目中&#xff0c;我们的文件存储是一个必不可少的环节&#xff0c;本博主了解到现在的存储方案有 购买纯系统的云服务器&#xff0c;自己安装个mino,再使用nginx代理给web使用购买OSS服务&#xff0c;现在有云厂商都有提供&#xff0c;储存价格也挺便宜的&#xff0c;…

如何在没有焊锡膏,只有助焊剂的情况下焊接芯片

焊接bq76930 1、刷一层焊锡&#xff0c;可以先横着扫&#xff0c;然后再按着引脚向外的方面刷一遍 2、在引脚上面涂上助焊剂 3、把芯片放到助焊剂上面进行固定&#xff0c;注意对其引脚 4、对齐后找东西把芯片压住&#xff0c;先进行一个引脚的固定 5、把芯片反过来焊接对脚…