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

在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的关系,还学习了如何利用转义序列在字符串中嵌入特殊字符以及字符集和字符编码的知识。

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【leetcode面试经典150题】-27. 移除元素

88.合并两个有序数组 1 题目介绍1 个人解题思路1.1 解题代码1.2 思路解析 2、分析官方题解2.1 单侧双指针2.2 双侧双指针 1 题目介绍 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。 不要使用额外…

C++自定义脚本文件执行

FunctionCall.h&#xff1a; #include <sstream> #include <string> #include <vector> // 函数调用 class FunctionCall { public: FunctionCall(); ~FunctionCall(); std::string call(const st…

天锐绿盾和bitlocker有啥区别?

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

每日一题:最大加号标志

在一个 n x n 的矩阵 grid 中&#xff0c;除了在数组 mines 中给出的元素为 0&#xff0c;其他每个元素都为 1。mines[i] [xi, yi]表示 grid[xi][yi] 0 返回 grid 中包含 1 的最大的 轴对齐 加号标志的阶数 。如果未找到加号标志&#xff0c;则返回 0 。 一个 k 阶由 1 组…

永磁同步电机的脉振高频注入无速度传感器simulink仿真模型

整理了永磁同步电机的脉振高频注入无速度传感器simulink仿真模型&#xff0c;该模型高频注入仿真pmsm&#xff0c;无感控制&#xff0c;解决0速转矩输出问题&#xff0c;插入式永磁同步电机&#xff0c;凸极&#xff0c;高频注入。MATLAB/simulink仿真&#xff0c;适合研究学习…

深度学习面试问题 | 降维

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

No Cortex-M SW Device Found

将DIO和CLK管脚调换一下

【制作100个unity游戏之26】unity2d横版卷轴动作类游戏4(附带项目源码)

最终效果 系列导航 文章目录 最终效果系列导航前言添加敌人受击动画第一种 配置闪烁动画第二种 受伤击退效果人物死亡源码完结 前言 欢迎来到【制作100个Unity游戏】系列&#xff01;本系列将引导您一步步学习如何使用Unity开发各种类型的游戏。在这第26篇中&#xff0c;我们将…

一文读懂:低代码

引言 在数字化转型的时代&#xff0c;软件开发已经成为企业迅速响应市场需求和创新的关键。然而&#xff0c;传统的软件开发模式往往面临着繁琐的代码编写、长周期的开发时间以及对技术专业知识的依赖&#xff0c;这使得许多企业在追求创新和业务扩展的过程中倍感束手无策。 …

dragonbones 5.6.3不能导出的解决办法

问题描述 使用dragonbones 5.6.3导出资源时无反应。 解决方法 第一步安装node.js&#xff0c;我这里使用的是V18.16.0第二步进入到DragonBonesPro\egretlauncher\server\win目录&#xff0c;然后把里面的node.exe替换为刚刚下载的node文件夹即可&#xff0c;如下图&#xff…

Synchronize 底层实现原理

1 、加锁实现原理 public class SynchronizedTest {public void get(){synchronized (this){ // 这个是同步代码块System.out.println("你好呀");}}public synchronized void f(){ //这个是同步方法System.out.println("Hello world");}public s…

数据生命周期管理:从提取到治理再到安全保障的全面策略

在大数据的时代背景下&#xff0c;数据已经成为企业运营不可或缺的资源。然而&#xff0c;数据的管理并非易事&#xff0c;特别是在数据的整个生命周期中——从数据的提取、治理到安全保障&#xff0c;每一个环节都至关重要。本文将探讨如何制定一个全面的数据生命周期管理策略…

单片机开发板上外设资源讲解

单片机开发电路板上简单外设 开发板上各基础外设LED灯按键&#xff1a;数码管介绍液晶屏矩阵键盘扫描的概念LED点阵屏实时时钟蜂鸣器存储器 温度传感器&单总线 开发板上各基础外设 LED灯 中文名&#xff1a;发光二极管 外文名&#xff1a;Light Emitting Diode 简称&…

elasticsearch(下载安装、基本操作、查询、聚合、SpringData-Elasticsearch)

文章目录 1. 了解搜索技术1.1. 什么是搜索1.2. 新业务需求1.3. 搜索引擎1.4. 倒排索引(Inverted index)1.5. 认识lucene1.6. 什么是全文检索 2.下载安装2.1. elastic2.2 下载2.2.1 elasticsearch2.2.2 kibana地址2.2.3 ik中文分词器地址 2.3 安装elasticsearch2.3.1 安装elasti…

AI Agent LangChain使用方法记录

B站教程OpenAI官网获取密钥&#xff1a; OPENAI官网获取KEY 报错“Did not find openai_api_key, please add an environment variable OPENAI_API_KEY”

智能网红主播直播手机:助您轻松卖货、卖团购卷、拓客利器!

在当下快速发展的电商行业中&#xff0c;直播销售已经成为无可忽视的一大趋势。智能网红主播直播手机的出现&#xff0c;让人们无需拥有专业设备和经验&#xff0c;便可轻松参与直播销售&#xff0c;享受销售乐趣。本文将介绍智能网红主播直播手机的操作简单、易上手以及其在卖…

JSON格式化输出html——数组+对象+JSON字符串+汉字——基础积累——@pgrabovets/json-view

昨天写了一篇关于JSON格式化输出到页面上——数组对象JSON字符串汉字——基础积累的文章&#xff0c;效果是可以实现的 但是如果要实现右侧部分的展开/折叠&#xff0c;则可以使用到下面的插件了pgrabovets/json-view github链接&#xff1a;https://github.com/pgrabovets/j…

【C语言】水仙花数

问题 水仙花数&#xff08;Narcissistic number&#xff09;也被称为超完全数字不变数&#xff08;pluperfect digital invariant, PPDI&#xff09;、自恋数、自幂数或阿姆斯壮数数&#xff08;Armstrong number&#xff09;。 它是指一个n位数&#xff08;n≥3&#xff09;…

什么样的开放式耳机好用舒服?五款高人气质量绝佳产品力荐!

​随着人们越来越注重个人的身体健康问题&#xff0c;掀起了一股运动浪潮&#xff0c;现在大家都会喜欢跑跑步&#xff0c;运动一下使自己的身体更好&#xff0c;那么在运动时候如果能有音乐听的话&#xff0c;人们的运动状态就能达到更好的水平。鉴于传统入耳式耳机给用户带来…

特征模态分解(FMD):一种小众而又新颖的分解方法

​ 声明&#xff1a;文章是从本人公众号中复制而来&#xff0c;因此&#xff0c;想最新最快了解各类智能优化算法及其改进的朋友&#xff0c;可关注我的公众号&#xff1a;强盛机器学习&#xff0c;不定期会有很多免费代码分享~ 今天为大家介绍一个小众而又新颖的信号分…