news 2026/5/12 15:39:47

Java——Character

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Java——Character

Character

    • 1、Unicode基础
    • 2、检查code point和char
    • 3、code point与char的转换
    • 4、按code point处理char数组或序列
    • 5、字符属性
    • 6、字符转换

1、Unicode基础

Unicode给世界上每个字符分配了一个编号,编号范围为0x000000~0x10FFFF。编号范围在0x0000~0xFFFF的字符为常用字符集,称BMP(Basic MultilingualPlane)字符。编号范围在0x10000~0x10FFFF的字符叫做增补字符(supplementary character)​。

Unicode主要规定了编号,但没有规定如何把编号映射为二进制。UTF-16是一种编码方式,或者叫映射方式,它将编号映射为两个或4个字节,对BMP字符,它直接用两个字节表示,对于增补字符,使用4个字节表示,前两个字节叫高代理项(high surrogate)​,范围为0xD800~ 0xDBFF,后两个字节叫低代理项(low surrogate)​,范围为0xDC00~0xDFFF。UTF-16定义了一个公式,可以将编号与4字节表示进行相互转换。

Java内部采用UTF-16编码,char表示一个字符,但只能表示BMP中的字符,对于增补字符,需要使用两个char表示,一个表示高代理项,一个表示低代理项。

使用int可以表示任意一个Unicode字符,低21位表示Unicode编号,高11位设为0。整数编号在Unicode中一般称为代码点(code point)​,表示一个Unicode字符,与之相对,还有一个词代码单元(code unit)表示一个char。

2、检查code point和char

//判断一个int是不是一个有效的代码点,小于等于0x10FFFF的为有效,大于的为无效publicstaticbooleanisValidCodePoint(intcodePoint)//判断一个int是不是BMP字符,小于等于0xFFFF的为BMP字符,大于的不是publicstaticbooleanisBmpCodePoint(intcodePoint)//判断一个int是不是增补字符,0x010000~0X10FFFF为增补字符publicstaticbooleanisSupplementaryCodePoint(intcodePoint)//判断char是否是高代理项,0xD800~0xDBFF为高代理项publicstaticbooleanisHighSurrogate(charch)//判断char是否为低代理项,0xDC00~0xDFFF为低代理项publicstaticbooleanisLowSurrogate(charch)//判断char是否为代理项, char为低代理项或高代理项,则返回truepublicstaticbooleanisSurrogate(charch)//判断两个字符high和low是否分别为高代理项和低代理项publicstaticbooleanisSurrogatePair(charhigh,charlow)//判断一个代码点由几个char组成,增补字符返回2, BMP字符返回1publicstaticintcharCount(intcodePoint)

3、code point与char的转换

除了简单的检查外,Character类中还有很多方法,进行code point与char的相互转换。

//根据高代理项high和低代理项low生成代码点,这个转换有个公式,这个方法封装了这个公式publicstaticinttoCodePoint(charhigh,charlow)//根据代码点生成char数组,即UTF-16表示,如果code point为BMP字符,则返回的char//数组长度为1,如果为增补字符,长度为2, char[0]为高代理项,char[1]为低代理项publicstaticchar[]toChars(intcodePoint)//将代码点转换为char数组,与上面方法类似,只是结果存入指定数组dst的指定位置indexpublicstaticinttoChars(intcodePoint,char[]dst,intdstIndex)//对增补字符code point,生成低代理项publicstaticcharlowSurrogate(intcodePoint)//对增补字符code point,生成高代理项publicstaticcharhighSurrogate(intcodePoint)

4、按code point处理char数组或序列

Character包含若干方法,以方便按照code point处理char数组或序列。

返回char数组a中从offset开始count个char包含的code point个数:

publicstaticintcodePointCount(char[]a,intoffset,intcount)

比如,如下代码输出为2, char个数为3,但code point为2。

char[]chs=newchar[3];chs[0]='马';Character.toChars(0x1FFFF,chs,1);System.out.println(Character.codePointCount(chs,0,3));

除了接受char数组,还有一个重载的方法接受字符序列CharSequence:

publicstaticintcodePointCount(CharSequenceseq,intbeginIndex,intendIndex)

CharSequence是一个接口,它的定义如下所示:

publicinterfaceCharSequence{intlength();charcharAt(intindex);CharSequencesubSequence(intstart,intend);publicStringtoString();}

它与一个char数组是类似的,有length方法,有charAt方法根据索引获取字符,String类就实现了该接口。

返回char数组或序列中指定索引位置的code point:

publicstaticintcodePointAt(char[]a,intindex)publicstaticintcodePointAt(char[]a,intindex,intlimit)publicstaticintcodePointAt(CharSequenceseq,intindex)

如果指定索引位置为高代理项,下一个位置为低代理项,则返回两项组成的code point,检查下一个位置时,下一个位置要小于limit,没传limit时,默认为a.length。

返回char数组或序列中指定索引位置之前的code point:

publicstaticintcodePointBefore(char[]a,intindex)publicstaticintcodePointBefore(char[]a,intindex,intstart)publicstaticintcodePointBefore(CharSequenceseq,intindex)

codePointAt是往后找,codePointBefore是往前找,如果指定位置为低代理项,且前一个位置为高代理项,则返回两项组成的code point,检查前一个位置时,前一个位置要大于等于start,没传start时,默认为0。

根据code point偏移数计算char索引:

publicstaticintoffsetByCodePoints(char[]a,intstart,intcount,intindex,intcodePointOffset)publicstaticintoffsetByCodePoints(CharSequenceseq,intindex,intcodePointOffset)

如果字符数组或序列中没有增补字符,返回值为index+codePointOffset,如果有增补字符,则会将codePointOffset看作code point偏移,转换为字符偏移,start和count取字符数组的子数组。

比如,如下代码:

char[]chs=newchar[3];Character.toChars(0x1FFFF,chs,1);System.out.println(Character.offsetByCodePoints(chs,0,3,1,1));输出结果为3,index和codePointOffset都为1,但第二个字符为增补字符,一个code point偏移是两个char偏移,所以结果为3

5、字符属性

Unicode在给每个字符分配一个编号之外,还分配了一些属性,Character类封装了对Unicode字符属性的检查和操作,下面介绍一些主要的属性。

获取字符类型(general category)​:

publicstaticintgetType(intcodePoint)publicstaticintgetType(charch)

Unicode给每个字符分配了一个类型,这个类型是非常重要的,很多其他检查和操作都是基于这个类型的。

getType方法的参数可以是int类型的code point,也可以是char类型。char类型只能处理BMP字符,而int类型可以处理所有字符。Character类中很多方法都是既可以接受int类型,也可以接受char类型,后续只列出int类型的方法。返回值是int,表示类型,Character类中定义了很多静态常量表示这些类型,下表列出了一些字符、type值,以及Character类中常量的名称。

字符type值常量名称
'A'1UPPERCASE_LEFTER
'a'2LOWERCASE_LEFTER
'马'5OTHER_LETTER
'1'9DECIMAL_DIGIT_NUMBER
''15SPACE_SEPARATOR
'\n'15CONTROL
'-'20DASH_PUNCTUATION
'{'21START_PUCNTUATION
'_'23CONNECTOR_PUNCTUATION
'&'24OTHER_PUNCTUATION
'<'25MATH_SYMBOL
'&'26CURRENCY_SYMBOL

检查字符是否在Unicode中被定义:

publicstaticbooleanisDefined(intcodePoint)

每个被定义的字符,其getType()返回值都不为0,如果返回值为0,表示无定义。注意与isValidCodePoint的区别,后者只要数字不大于0x10FFFF都返回true。

检查字符是否为数字:

publicstaticbooleanisDigit(intcodePoint)

getType()返回值为DECIMAL_DIGIT_NUMBER的字符为数字。需要注意的是,不光字符’0’、‘1’、……、'9’是数字,中文全角字符的0~9也是数字。比如:

charch='9';//中文全角数字System.out.println((int)ch+", "+Character.isDigit(ch));

输出为:

65305,true

全角字符的9, Unicode编号为65305,它也是数字。检查是否为字母(Letter)​:

publicstaticbooleanisLetter(intcodePoint)

如果getType()的返回值为下列之一,则为Letter:

UPPERCASE_LETTER LOWERCASE_LETTER TITLECASE_LETTER MODIFIER_LETTER OTHER_LETTER

除了TITLECASE_LETTER和MODIFIER_LETTER,其他在表中有示例,而这两个平时碰到的也比较少,就不介绍了。

只要其中之一返回true就返回true。

检查是否为字母(Alphabetic)​:

publicstaticbooleanisAlphabetic(intcodePoint)

这也是检查是否为字母,与isLetter的区别是:isLetter返回true时,isAlphabetic也必然返回true;此外,getType()值为LETTER_NUMBER时,isAlphabetic也返回true,而isLetter返回false。LETTER_NUMBER中常见的字符有罗马数字字符,如’I’、‘Ⅱ’、‘Ⅲ’、‘Ⅳ’。

检查是否为空格字符:

publicstaticbooleanisWhitespace(intcodePoint)

‘\t’、‘\n’、全角空格’ ‘和半角空格’ '的返回值都为true。

检查是否为小写字符:

publicstaticbooleanisLowerCase(intcodePoint)

常见的小写字符主要是小写英文字母a~z。

检查是否为大写字符:

publicstaticbooleanisUpperCase(intcodePoint)

常见的大写字符主要是大写英文字母A~Z。

检查是否为表意象形文字:

publicstaticbooleanisIdeographic(intcodePoint)

大部分中文都返回为true。

检查是否为ISO 8859-1编码中的控制字符:

publicstaticbooleanisISOControl(intcodePoint)

我们在第2章介绍过,0~31、127~159表示控制字符。

检查是否可作为Java标识符的第一个字符:

publicstaticbooleanisJavaIdentifierStart(intcodePoint)

Java标识符是Java中的变量名、函数名、类名等,字母(Alphabetic)​、美元符号($)​、下画线(_)可作为Java标识符的第一个字符,但数字字符不可以。

检查是否可作为Java标识符的中间字符:

publicstaticbooleanisJavaIdentifierPart(intcodePoint)

相比isJavaIdentifierStart,主要多了数字字符,Java标识符的中间字符可以包含数字。

检查是否为镜像(mirrowed)字符:

publicstaticbooleanisMirrored(intcodePoint)

常见镜像字符有( )、{ }、< >、​[ ]​,都有对应的镜像。

6、字符转换

Unicode除了规定字符属性外,对有大小写对应的字符,还规定了其对应的大小写,对有数值含义的字符,也规定了其数值。

我们先来看大小写,Character有两个静态方法,对字符进行大小写转换:

publicstaticinttoLowerCase(intcodePoint)publicstaticinttoUpperCase(intcodePoint)

这两个方法主要针对英文字符a~z和A~Z,例如:toLowerCase(‘A’)返回’a’, toUpper-Case(‘z’)返回’Z’。

返回一个字符表示的数值:

publicstaticintgetNumericValue(intcodePoint)

字符’0’~’9’返回数值0~9,对于字符a~z,无论是小写字符还是大写字符,无论是普通英文还是中文全角,数值结果都是10~35。例如,如下代码的输出结果是一样的,都是10。

System.out.println(Character.getNumericValue('A'));//全角大写ASystem.out.println(Character.getNumericValue('A'));System.out.println(Character.getNumericValue('a'));//全角小写aSystem.out.println(Character.getNumericValue('a'));

返回按给定进制表示的数值:

publicstaticintdigit(intcodePoint,intradix)

radix表示进制,常见的有二进制、八进制、十进制、十六进制,计算方式与get-NumericValue类似,只是会检查有效性,数值需要小于radix,如果无效,返回-1。例如:digit(‘F’,16)返回15,是有效的;但digit(‘G’,16)就无效,返回-1。

返回给定数值的字符形式:

publicstaticcharforDigit(intdigit,intradix)

与digit(int codePoint, int radix)相比,进行相反转换,如果数字无效,返回’\0’。例如, Character.forDigit(15,16)返回’F’。

与Integer类似,Character也有按字节翻转:

publicstaticcharreverseBytes(charch)

例如,翻转字符0x1234:

System.out.println(Integer.toHexString(Character.reverseBytes((char)0x1234)));

输出为3412。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/12 15:35:09

亚太半导体产业格局:日本、韩国、中国三大发展模式深度解析

1. 亚太半导体产业格局的深度剖析 在半导体这个全球最精密、竞争最激烈的工业领域里&#xff0c;亚太地区扮演着无可争议的核心角色。无论是我们日常使用的智能手机、电脑&#xff0c;还是汽车、工业设备&#xff0c;其内部的“大脑”——芯片&#xff0c;其设计、制造与封测的…

作者头像 李华
网站建设 2026/5/12 15:34:14

3分钟掌握离线实时语音转文字:TMSpeech让你的电脑变身智能字幕机

3分钟掌握离线实时语音转文字&#xff1a;TMSpeech让你的电脑变身智能字幕机 【免费下载链接】TMSpeech 腾讯会议摸鱼工具 项目地址: https://gitcode.com/gh_mirrors/tm/TMSpeech 你是否厌倦了每次开会都要手忙脚乱地记笔记&#xff1f;是否担心云端语音识别会泄露你的…

作者头像 李华
网站建设 2026/5/12 15:33:14

超高清电视普及困境解析:从技术参数到生态系统的完整思考

1. 超高清电视的“非主流”开局&#xff1a;一场始于2013年的行业迷思 如果你在2013年初的拉斯维加斯CES展上&#xff0c;听到关于“Ultra HDTV”&#xff08;超高清电视&#xff0c;后文简称UHDTV&#xff09;的喧嚣&#xff0c;感觉就像身处一场盛大的交响乐彩排现场——乐手…

作者头像 李华
网站建设 2026/5/12 15:26:02

OmenSuperHub:惠普OMEN游戏本性能优化终极指南,释放硬件真正潜力

OmenSuperHub&#xff1a;惠普OMEN游戏本性能优化终极指南&#xff0c;释放硬件真正潜力 【免费下载链接】OmenSuperHub 使用 WMI BIOS控制性能和风扇速度&#xff0c;自动解除DB功耗限制。 项目地址: https://gitcode.com/gh_mirrors/om/OmenSuperHub 你是否想让你的惠…

作者头像 李华