Char类型、转义及字符集:Java中的字符串奥秘

news2024/9/24 17:10:11

在Java的8中基本数据类型中,char类型是较难掌握,处理char类型本身的用法之外,还要理解其与字符串的关系、转义序列、字符集。

本文将从基础概念出发,逐步深入探讨这些主题,并通过实例演示来巩固理解。

一、Char类型:Java中的字符基石

1.1 Char类型简介

在Java中,char是一种基本数据类型,用于存储单个字符。每个char类型变量占用2字节(即16位)的内存空间。

1.2 Unicode与编码

Unicode是一个包含世界上大多数书面语言字符的标准字符集,它为每种字符分配了一个唯一的数字——码点(code point)。通俗的说,码点是每个字符的唯一编号,计算机真正存储的是码点,在显示时通过字符集转换为字符。

Unicode字符列表,红框内是码点:

在这里插入图片描述

使用Java中的code point API:

在这里插入图片描述Java的char类型直接支持Unicode,使用UTF-16编码方案进行内部表示。UTF-16是一种可变长度的字符编码方式,对于BMP(基本多语言平面)内的字符使用单个16位码元(即一个char),而对于补充平面的字符则需要一对char(称为代理对)来表示。

思考题:
char占用2个字节(16位),根据高中的排列组合知识,最多能表示2^16-1即65535个字符,但Unicode 4.0中定义了大约137,994个字符,远大于65535,那么其他的字符在Java中如何展示呢?

1.3 Demo:Char的使用

public class CharDemo {
    public static void main(String[] args) {
        char letter = 'A'; // ASCII字符
        char chineseChar = '中'; // 中文字符
        
        System.out.println("ASCII Character: " + letter);
        System.out.println("Chinese Character: " + chineseChar);
        
        // 使用转义字符
        char newline = '\n';
        char tab = '\t';
        System.out.println("Newline Example:\nThis is on a new line.");
        System.out.println("Tab Example:\tThis is indented with a tab.");

        // 比如这个一家四口符号:👨‍👩‍👧‍👦,虽然是一个字符,但其编码是两个字符,已经不能用char类型变量表示了
        String smileFace = "👨‍👩‍👧‍👦";
        System.out.println("CodePoint of smileFace: " + smileFace.codePointAt(0));
    }
}

在这里插入图片描述

二、转义序列:特殊字符的魔法

2.1 为什么要转义

在编写Java程序时,要写出正确的代码,有时必须用到转义。顾名思义,转义就是把看到的字符转换为规定的另一种字符

为什么不能直接在代码中指定目标字符呢?

主要有如下两个原因:

❶用转义字符表示具有特殊意义、无法输入的字符

如下图,想要实现字符串换行的效果,但是没有直接表示换行的字符,所以要用转义换行符“\n”,计算机读到这个字符就会另起一行。
在这里插入图片描述
❷会引发语法错误或具有特殊意义的字符。比方说如果字符串中包含一个双引号“"”,不转义就会报错。

在这里插入图片描述

2.2 常见转义序列

  • \n 新行(Line Feed)
  • \r 回车(Carriage Return)
  • \t 制表符(Horizontal Tab)
  • \" 双引号(用于字符串中嵌入双引号)
  • \\ 反斜杠(用于在字符串中表示反斜杠本身)

2.3 高级转义序列

除了上述常见的转义序列,Java还支持Unicode转义序列,格式为\uXXXX,其中XXXX代表字符的Unicode码点值的十六进制表示。这使得即使是无法直接键入的字符也能被轻松表示。

比如下图表示“一家四口”的字符,就需要通过转义字符来表示:
在这里插入图片描述

String smileFace = "\uD83D\uDC68\u200D\uD83D\uDC69\u200D\uD83D\uDC67\u200D\uD83D\uDC66";

System.out.println("smileFace: " + smileFace);

2.4 Demo:转义序列实践

public class EscapeSequenceDemo {
    public static void main(String[] args) {
        String text = "Hello, World!\nWelcome to Java.\tThis uses a tab.";
        System.out.println(text);
        
        // 使用Unicode转义序列
        String smiley = "\u263A";
        System.out.println("Smiley face: " + smiley);
    }
}

在这里插入图片描述

三、字符集:跨越编码的桥梁

3.1 字符集与编码简述

字符集定义了字符的集合及其对应的编号(码点),而字符编码则是将这些编号转换成计算机可以存储和处理的二进制形式的过程。常见的字符集包括ASCII、ISO-8859-1、GBK和UTF-8等。

3.2 Unicode与UTF-8

Unicode作为跨语言的标准字符集,解决了不同语言字符编码不统一的问题。UTF-8是一种非常流行的Unicode实现方式,它是一种变长编码,对于英文字符使用1字节,对于大部分常用字符使用2或3字节,对于更复杂的字符可能使用4字节,这种设计使得UTF-8既高效又兼容ASCII。

3.3 Java中的字符集处理

Java在处理字符串时,默认采用Unicode编码。但在读写文件、网络通信等操作时,需要指定或识别外部系统的字符编码。使用Charset类可以更好地处理字符集问题,例如,使用StandardCharsets.UTF_8来指定使用UTF-8编码。

3.4 Demo:字符集转换

import java.nio.charset.StandardCharsets;
import java.nio.charset.Charset;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;

public class CharsetDemo {
    public static void main(String[] args) throws Exception {
        String original = "你好,世界!";
        byte[] utf8Bytes = original.getBytes(StandardCharsets.UTF_8);
        System.out.println("UTF-8 bytes: " + new String(utf8Bytes, StandardCharsets.UTF_8));
        
        // 转换编码
        Charset gbkCharset = Charset.forName("GBK");
        ByteBuffer inputBuffer = ByteBuffer.wrap(utf8Bytes);
        CharBuffer decodedChars = gbkCharset.decode(inputBuffer);
        byte[] gbkBytes = gbkCharset.encode(decodedChars).array();
        System.out.println("GBK bytes: " + new String(gbkBytes, "GBK"));
    }
}

四、总结

通过本文的探讨,本文介绍了Java中char类型的特性及其与Unicode的关系,还学习了如何利用转义序列在字符串中嵌入特殊字符以及字符集和字符编码的知识。

实际上,在开发过程中,因为字符集不同而导致乱码的情况并不鲜见。所以,有必要掌握这部分知识。

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

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

相关文章

(001)apidoc 的安装

安装 1.确定 node 和 npm 的匹配版本 node -vv10.14.1# 切换node 版本 nvm list nvm use 20.12.22.安装 apidoc。 npm install -g apidoc3.生成文档: apidoc -i ../ -o document/ -f ".java$"-i :指定扫描路径。-o:输出目录。…

短剧私域-快速引流变现

短剧的爆火,衍生出了很多周边项目。 比如免费看剧App,短剧搜索机器人,短剧付费圈子等等。 这些项目的本质,就是借助短剧的热度,把流量引到自己的鱼塘进行变现。 短剧机器人大家都知道,目前最火的一种玩法…

Nginx+Keepalived高可用集群

NginxKeepalived高可用集群 服务器准备 服务器名IP软件包主从n1RIP 192.168.99.111 VIP 192.168.99.200nginx keepaliveMASTERn2RIP192.168.99.122 VIP 192.168.99.200nginx keepalivedh1RIP 192.168.99.133 VIP 192.168.99.200httpdh2RIP 192.168.32.144 VIP 192.168.99.200h…

2024江苏省赛 H. 完蛋,我被房产包围了 【费用流、分时图】

完蛋,我被房产包围了 n ≤ 200 , ∑ n ≤ 1 0 4 n \leq 200, \sum n \leq 10^4 n≤200,∑n≤104 求出最大利润 思路 每个代理商每次买房狂潮只能卖出 1 1 1 套房子,小红卖出一套房子贬值 1 1 1 元,小绿卖出一套房子贬值 ⌈ a i 10 ⌉ \…

短视频世上无人再似她:成都鼎茂宏升文化传媒公司

短视频世上无人再似她 —— 记忆中的光影传奇 在短视频盛行的今天,每一位创作者都在用镜头捕捉生活,记录世界,但有那么一位艺术家,她的作品如同夜空中最亮的星,即便是在信息洪流中,也依然闪耀着独一无二的…

数字社交的先锋:探索Facebook的未来发展

在当今数字化时代,社交媒体已经成为人们日常生活中不可或缺的一部分。而在众多社交平台中,Facebook一直处于引领地位,不断探索和创新,塑造着数字社交的未来。本文将深入探讨Facebook作为数字社交的先锋,探索其未来发展…

天锐绿盾和bitlocker有啥区别?

#绿盾文档加密系统# 天锐绿盾和BitLocker是两种不同的数据加密解决方案,它们各自有不同的重点和应用场景,以下是它们之间的主要区别: PC地址: https://isite.baidu.com/site/wjz012xr/2eae091d-1b97-4276-90bc-6757c5dfedee 移动…

华为hcip是什么?华为hcip网络工程师值得考吗?

前面我们讲了华为认证各个方向hcie的内容,那么很多同学会问,华为hcip是什么?华为hcip网络工程师值得考吗? 华为HCIP是什么? 华为HCIP(Huawei Certified ICT Professional)认证是华为技术有限公…

这三个网站我愿称之为制作答辩PPT的神

很多快要毕业的同学在做答辩PPT的时候总是感觉毫无思路,一窍不通。但这并不是你们的错,对于平时没接触过相关方面,第一次搞答辩PPT的人来说,这是很正常的一件事。一个好的答辩PPT可以根据以下分为以下几部分来写。 1.研究的背景和…

Leetcode—3146. 两个字符串的排列差【简单】

2024每日刷题&#xff08;135&#xff09; Leetcode—3146. 两个字符串的排列差 实现代码 class Solution { public:int findPermutationDifference(string s, string t) {int maps[26];int mapt[26];for(int i 0; i < s.size(); i) {int idxs s[i] - a;int idxt t[i] …

精酿啤酒的未来:啤酒的发展与展望

随着人们生活水平的提高和对品质生活的追求&#xff0c;精酿啤酒逐渐受到了广泛的关注和喜爱。作为精酿啤酒的代表&#xff0c;Fendi club啤酒凭借其与众不同的酿造工艺与技术&#xff0c;逐渐在市场中树立了良好的口碑。然而&#xff0c;面对未来激烈的竞争和不断变化的市场需…

摸鱼大数据——Linux搭建大数据环境(安装zooKeeper和zookeeper shell命令)五

安装zookeeper软件 1.上传软件 使用CRT等客户端远程上传 zookeeper-3.4.6.tar.gz 文件到/export/software目录下 2.解压软件 [rootnode1 ~]# cd /export/software/ [rootnode1 software]# tar -xzvf zookeeper-3.4.6.tar.gz -C /export/server/ [rootnode1 software]# cd /ex…

CentOS上Zookeeper集群安装部署

简介 Zookeeper是一款分布式的集群化软件&#xff0c;可以在多台服务器上部署&#xff0c;并协同组成分布式集群一起工作。 ZooKeeper是一个分布式的&#xff0c;开放源码的分布式应用程序协调服务&#xff0c;是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的…

若依cloud-plus(RuoYi-Cloud-Plus)框架(后端)分析

文章目录 本文以mysql为例项目结构图环境(最起码的配置)数据库初始化文件位置配置服务启动架构图框架分析&#xff1a; 本文以mysql为例 官方文档&#xff1a; https://plus-doc.dromara.org/#/ruoyi-cloud-plus/home 项目结构图 RuoYi-Cloud-Plus ├─ ruoyi-api …

霸道龙尊短视频:成都鼎茂宏升文化传媒公司

霸道龙尊短视频&#xff1a;龙族的传奇与现代的交融 在数字化时代的浪潮中&#xff0c;短视频以其短小精悍、内容丰富的特点&#xff0c;迅速占领了人们的碎片时间。成都鼎茂宏升文化传媒公司而在这些短视频中&#xff0c;一股独特的“霸道龙尊”风潮正在悄然兴起&#xff0c;…

JavaScript基础(七)

isNaN //用来判断一个变量是不是一个非数字 不是来判断是不是number类型&#xff0c;而是判断当前值能不能转为number类型&#xff0c;OK&#xff1f;懂了。 还有同学不明白&#xff0c;来看实例: <script> //isNaN(非数字)→true &#xff08;数字&#xff09;→fal…

实战| 手把手教你实现俯卧撑实时计数:OpenCV+MediaPipe

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

No Cortex-M SW Device Found

将DIO和CLK管脚调换一下

从0到1,百亿级任务调度平台的架构与实现

尼恩&#xff1a;百亿级海量任务调度平台起源 在40岁老架构师 尼恩的读者交流群(50)中&#xff0c;经常性的指导小伙伴们改造简历。 经过尼恩的改造之后&#xff0c;很多小伙伴拿到了一线互联网企业如得物、阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试机会&#x…

深度学习面试问题 | 降维

本文给大家带来的百面算法工程师是深度学习降维面试总结&#xff0c;文章内总结了常见的提问问题&#xff0c;旨在为广大学子模拟出更贴合实际的面试问答场景。在这篇文章中&#xff0c;我们还将介绍一些常见的深度学习面试问题&#xff0c;并提供参考的回答及其理论基础&#…