Java——Character
Character1、Unicode基础2、检查code point和char3、code point与char的转换4、按code point处理char数组或序列5、字符属性6、字符转换1、Unicode基础Unicode给世界上每个字符分配了一个编号编号范围为0x0000000x10FFFF。编号范围在0x00000xFFFF的字符为常用字符集称BMPBasic MultilingualPlane字符。编号范围在0x100000x10FFFF的字符叫做增补字符supplementary character。Unicode主要规定了编号但没有规定如何把编号映射为二进制。UTF-16是一种编码方式或者叫映射方式它将编号映射为两个或4个字节对BMP字符它直接用两个字节表示对于增补字符使用4个字节表示前两个字节叫高代理项high surrogate范围为0xD800 0xDBFF后两个字节叫低代理项low surrogate范围为0xDC000xDFFF。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是不是增补字符0x0100000X10FFFF为增补字符publicstaticbooleanisSupplementaryCodePoint(intcodePoint)//判断char是否是高代理项0xD8000xDBFF为高代理项publicstaticbooleanisHighSurrogate(charch)//判断char是否为低代理项0xDC000xDFFF为低代理项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[]chsnewchar[3];chs[0]马;Character.toChars(0x1FFFF,chs,1);System.out.println(Character.codePointCount(chs,0,3));除了接受char数组还有一个重载的方法接受字符序列CharSequencepublicstaticintcodePointCount(CharSequenceseq,intbeginIndex,intendIndex)CharSequence是一个接口它的定义如下所示publicinterfaceCharSequence{intlength();charcharAt(intindex);CharSequencesubSequence(intstart,intend);publicStringtoString();}它与一个char数组是类似的有length方法有charAt方法根据索引获取字符String类就实现了该接口。返回char数组或序列中指定索引位置的code pointpublicstaticintcodePointAt(char[]a,intindex)publicstaticintcodePointAt(char[]a,intindex,intlimit)publicstaticintcodePointAt(CharSequenceseq,intindex)如果指定索引位置为高代理项下一个位置为低代理项则返回两项组成的code point检查下一个位置时下一个位置要小于limit没传limit时默认为a.length。返回char数组或序列中指定索引位置之前的code pointpublicstaticintcodePointBefore(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)如果字符数组或序列中没有增补字符返回值为indexcodePointOffset如果有增补字符则会将codePointOffset看作code point偏移转换为字符偏移start和count取字符数组的子数组。比如如下代码char[]chsnewchar[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 categorypublicstaticintgetType(intcodePoint)publicstaticintgetType(charch)Unicode给每个字符分配了一个类型这个类型是非常重要的很多其他检查和操作都是基于这个类型的。getType方法的参数可以是int类型的code point也可以是char类型。char类型只能处理BMP字符而int类型可以处理所有字符。Character类中很多方法都是既可以接受int类型也可以接受char类型后续只列出int类型的方法。返回值是int表示类型Character类中定义了很多静态常量表示这些类型下表列出了一些字符、type值以及Character类中常量的名称。字符type值常量名称A1UPPERCASE_LEFTERa2LOWERCASE_LEFTER马5OTHER_LETTER19DECIMAL_DIGIT_NUMBER15SPACE_SEPARATOR\n15CONTROL-20DASH_PUNCTUATION{21START_PUCNTUATION_23CONNECTOR_PUNCTUATION24OTHER_PUNCTUATION25MATH_SYMBOL26CURRENCY_SYMBOL检查字符是否在Unicode中被定义publicstaticbooleanisDefined(intcodePoint)每个被定义的字符其getType()返回值都不为0如果返回值为0表示无定义。注意与isValidCodePoint的区别后者只要数字不大于0x10FFFF都返回true。检查字符是否为数字publicstaticbooleanisDigit(intcodePoint)getType()返回值为DECIMAL_DIGIT_NUMBER的字符为数字。需要注意的是不光字符’0’、‘1’、……、9’是数字中文全角字符的09也是数字。比如charch9;//中文全角数字System.out.println((int)ch, Character.isDigit(ch));输出为65305,true全角字符的9, Unicode编号为65305它也是数字。检查是否为字母LetterpublicstaticbooleanisLetter(intcodePoint)如果getType()的返回值为下列之一则为LetterUPPERCASE_LETTER LOWERCASE_LETTER TITLECASE_LETTER MODIFIER_LETTER OTHER_LETTER除了TITLECASE_LETTER和MODIFIER_LETTER其他在表中有示例而这两个平时碰到的也比较少就不介绍了。只要其中之一返回true就返回true。检查是否为字母AlphabeticpublicstaticbooleanisAlphabetic(intcodePoint)这也是检查是否为字母与isLetter的区别是isLetter返回true时isAlphabetic也必然返回true此外getType()值为LETTER_NUMBER时isAlphabetic也返回true而isLetter返回false。LETTER_NUMBER中常见的字符有罗马数字字符如’I’、‘Ⅱ’、‘Ⅲ’、‘Ⅳ’。检查是否为空格字符publicstaticbooleanisWhitespace(intcodePoint)‘\t’、‘\n’、全角空格’ ‘和半角空格’ 的返回值都为true。检查是否为小写字符publicstaticbooleanisLowerCase(intcodePoint)常见的小写字符主要是小写英文字母az。检查是否为大写字符publicstaticbooleanisUpperCase(intcodePoint)常见的大写字符主要是大写英文字母AZ。检查是否为表意象形文字publicstaticbooleanisIdeographic(intcodePoint)大部分中文都返回为true。检查是否为ISO 8859-1编码中的控制字符publicstaticbooleanisISOControl(intcodePoint)我们在第2章介绍过031、127159表示控制字符。检查是否可作为Java标识符的第一个字符publicstaticbooleanisJavaIdentifierStart(intcodePoint)Java标识符是Java中的变量名、函数名、类名等字母Alphabetic、美元符号$、下画线_可作为Java标识符的第一个字符但数字字符不可以。检查是否可作为Java标识符的中间字符publicstaticbooleanisJavaIdentifierPart(intcodePoint)相比isJavaIdentifierStart主要多了数字字符Java标识符的中间字符可以包含数字。检查是否为镜像mirrowed字符publicstaticbooleanisMirrored(intcodePoint)常见镜像字符有( )、{ }、 、[ ]都有对应的镜像。6、字符转换Unicode除了规定字符属性外对有大小写对应的字符还规定了其对应的大小写对有数值含义的字符也规定了其数值。我们先来看大小写Character有两个静态方法对字符进行大小写转换publicstaticinttoLowerCase(intcodePoint)publicstaticinttoUpperCase(intcodePoint)这两个方法主要针对英文字符az和AZ例如toLowerCase(‘A’)返回’a’, toUpper-Case(‘z’)返回’Z’。返回一个字符表示的数值publicstaticintgetNumericValue(intcodePoint)字符’0’’9’返回数值09对于字符az无论是小写字符还是大写字符无论是普通英文还是中文全角数值结果都是1035。例如如下代码的输出结果是一样的都是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)例如翻转字符0x1234System.out.println(Integer.toHexString(Character.reverseBytes((char)0x1234)));输出为3412。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2606484.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!