Java中的字符表示

news/2025/2/21 10:54:07/

1、java中的char的大小是范围是0到0xffff,能表示绝大多数的中文。

/*** The constant value of this field is the smallest value of type* {@code char}, {@code '\u005Cu0000'}.** @since   1.0.2*/public static final char MIN_VALUE = '\u0000';/*** The constant value of this field is the largest value of type* {@code char}, {@code '\u005CuFFFF'}.** @since   1.0.2*/public static final char MAX_VALUE = '\uFFFF';

一个char能表示的范围的字符称为:Basic Multilingual Plane(BMP),Java设计的初始,大家天真地认为两个字节大小(65536)已经能表示完世界上所有要用到的符号,所以java在给自己设计char类型的时候,用了两个字节(unsigned short)定义char(一开始的UCS-2,后来的UTF-16),UTF-16编码方式:字符编码的概念(UTF-8、UTF-16、UTF-32都是什么鬼)_顾小暖的博客-CSDN博客。

2、java对应utf-16演变的修改

java设计者当时是基于UCS-2固定两个字节能表示所有unicode字符来设计的char类型,既然UCS-2演化为了utf-16,由定长变为不定长,所以也得跟着调整,当时char类型已经是固定两个字节了,所以char就是固定两个字节,因此如今也只能表示BMP范畴的字符,当然这包括了BMP范畴内的那些无效码位,也就是char能够表示high/low surrougate。

这感觉就像开发者已经实现了预期的功能,然后产品经理跑过来说需求变更了...

官方关于如何支持non-BMP的说明:

​www.oracle.com/technical-resources/articles/javase/supplementary.html

单个char无法表示non-BMP字符,但是两个char组合一起就可以。

这也是为什么单个char类型表示non-BMP字符编译不过,而String可以的原因(java9之前String是使用char[]实现,后面是byte[]实现)。

3、code point和code unit

/*** 输出* 龘* 知乎-发现更大的世界,😂* 30693 20046 45 21457 29616 26356 22823 30340 19990 30028 65292 128514* code unit size:13* code point size:12*/@Testpublic void testChar1() {char ch = '龘';System.out.println(ch);//        for (int i = 0; i <= Integer.MAX_VALUE; i++) {
//            char c = (char) i;
//            System.out.print(c);
//            System.out.println("=" + i);
//        }//对non-MBP的字符,使用两个char来保存final String content = "知乎-发现更大的世界,\uD83D\uDE02";for (int i = 0; i < content.length(); i++) {char c = content.charAt(i);System.out.print(c);}System.out.println();for (int i = 0; i < content.length(); i++) {char c = content.charAt(i);System.out.print(c + " ");}System.out.println();for (int j = 0; j < content.codePointCount(0, content.length()); j++) {int value = content.codePointAt(j);System.out.print(value + " ");}System.out.println();//char 数组的大小是13个System.out.println("code unit size:" + content.length());//表示的字符只有12个System.out.println("code point size:" + content.codePointCount(0, content.length()));}

java.lang.String#codePointAt这个方法要注意参数index的索引是unit size的索引,不是point size的索引,所以如果你有如下代码:

@Testpublic void testChar2() {String content = "\uD83D\uDE00\uD83D\uDE01\uD83D\uDE02\uD842\uDCB8\uD841\uDF96";System.out.println(content);for (int j = 0; j < 5; j++) {//需要每次读取两个才能得到正确的Unicode编码int value = content.codePointAt(j * 2);System.out.print(value + " ");}}


http://www.ppmy.cn/news/74188.html

相关文章

PyQt5桌面应用开发(17):类结构+QWebEngineView

本文目录 PyQt5桌面应用系列PyQt5学习PyQt5类结构和帮助速查实现与解释最终界面和完整源代码界面完整的代码 总结 PyQt5桌面应用系列 PyQt5桌面应用开发&#xff08;1&#xff09;&#xff1a;需求分析 PyQt5桌面应用开发&#xff08;2&#xff09;&#xff1a;事件循环 PyQt5桌…

WebRTC系列-音频优先级(流的优先级控制)

文章目录 1. 带宽分配优先级1.1 LowRateAllocation1.2 NormalRateAllocation1.3 BitrateAllocator::DistributeBitrateRelatively 按照优先级分配1.4 BitrateAllocator::DistributeBitrateEvenly1.5 调试2. 发包优先级 pacer中的处理音频对流的实时性要求比较高,对流的连续性要…

【王道·操作系统】第一章计算机系统概述

一、 操作系统的基本概念 1.1 概念&#xff08;定义&#xff09;&#xff1a;什么是操作系统 操作系统operating system,OS&#xff1a;控制和管理整个计算机系统的硬件和软件资源&#xff0c;并合理地组织调度计算机的工作和资源的分配&#xff1b;以提供给用户和其他软件方…

opencv缺陷检测

随着自动化生产设备的普及&#xff0c;工业机器人在各行各业的应用也越来越广泛&#xff0c;越来越多的生产线由自动化设备取代人工操作&#xff0c;实现自动化生产。在机器人分拣过程中&#xff0c;机器人不仅可以将不同规格和质量的产品准确地放入指定的托盘中&#xff0c;而…

vTESTstudio概述

vTESTstudio支持的测试用例编写方式 项目层级结构 从用例编写到测试执行及生成报告的整个流程 vTESTsutido 开发&#xff0c;CANoe执行测试 界面简介 CANoe 创建的测试用例用Test Modules执行&#xff0c;vTESTstudio 创建的测试用例用Test Units执行 先在vTESTstudio里创建pr…

day5 套接字属性设置

选项的级别 SOL_SOCKET 该级别的选项只作用于套接字本身 SOL_LRLMP 该级别的选项作用于IrDA协议 IPPROTO_IP 该级别的选项作用于IPv4协议 IPPROTO_IPV6 该级别的选项作用于IPv6协议 IPPROTO_RM 该级别的选项作用于可靠的多播传输 IPPROTO_TCP 该级别的选项适用于流式…

CAPL(vTESTStudio) - 自动创建带有时间戳的报告和log

目录 getLocalTime - 获取本地时间函数 代码示例 获取当前时间并形成格式:"2023_05_22_23_20_18"

Win10系统电脑开机黑屏一直转圈无法进入桌面怎么办?

Win10系统电脑开机黑屏一直转圈无法进入桌面怎么办&#xff1f;有用户电脑开机了之后无法进入到桌面中&#xff0c;开机了之后&#xff0c;电脑桌面只有显示一个黑屏和转圈的图标&#xff0c;一直都无法进入到桌面中。强制重启电脑之后依然是这样&#xff0c;那么这个情况怎么去…