java基础类Character源码分析

本文详细分析了Java中的Character类,包括其与Unicode的关系,特别是对于16位Unicode编码不能表示的增补字符的处理。Character类提供了处理补充字符和代理代码单元的相关方法,如判断代码点、代理代码单元等,确保对Unicode扩展字符的支持。同时,还涵盖了Character类的属性、构造方法和常用方法的使用。
摘要由CSDN通过智能技术生成

目录

简介

属性

进制相关-radix

字符大小相关

补充字符与代理代码单元相关

基础属性

char与位,字节相关

构造方法

构造器

valueOf与缓存

基本方法

返回char

hashcode

equal

toString

与补充字符与代理代码单元相关方法

判断代码点

判断代理代码单元

代理点,代码单元的个数与互转


 


简介

Character 类用于对单个字符进行操作。

Character 类在对象中包装一个基本类型 char 的值

注释里详细地讲了java中char,代码点,代码单元的关系

16 位unicode编码的所有 65,536 个字符并不能完全表示全世界所有正在使用或曾经使用的字符。于是,Unicode 标准已扩展到包含多达 1,112,064 个字符。那些超出原来的16 位限制的字符被称作增补字符。Java的char类型是固定16bits的。代码点在U+0000 — U+FFFF之内到是可以用一个char完整的表示出一个字符。但代码点在U+FFFF之外的,一个char无论如何无法表示一个完整字符。这样用char类型来获取字符串中的那些代码点在U+FFFF之外的字符就会出现问题。

增补字符是代码点在 U+10000 至 U+10FFFF 范围之间的字符,也就是那些使用原始的 Unicode 的 16 位设计无法表示的字符。从 U+0000 至 U+FFFF 之间的字符集有时候被称为基本多语言面 (BMP UBasic Multilingual Plane )。因此,每一个 Unicode 字符要么属于 BMP,要么属于增补字符。

/**
 * <p>Charactre类包装了原始类型char的值到一个对象。
 * 一个Character类的对象包含了一个单独的字段,类型为char。
 * 
 * <p>此外,这个类提供了几个方法,包括确定一个字符的种类(小写字符,数字,等等),
 * 将字符从大写转换为小写,反之亦然。
 * 
 * <p>字符信息基于版本6.2.0的Unicode标准
 * 
 * <p>Character类的方法和数据由Unicode协会维护的Unicode字符数据库
 * 的一部分UnicodeData文件的信息定义。
 * 这个文件为每个定义的Unicode编码点或者字符范围,指定包括名字和通用类别的属性。
 * 
 * <p>这个文件及其描述能从Unicode协会获得:http://www.unicode.org
 * 
 * <p>char数据类型(Character对象封装的值)是基于原始Unicode规范,
 * 它定义字符是固定长度的16bit的实体。
 * Unicode标准后来出现了变化,允许出现超过16位的字符。
 * 合法的代码点的范围是在U+0000到U+10FFFF,成为Unicode标量值。(请参考Unicode标准中U+n符号的定义。)
 * 
 * <p>从U+0000 到 U+FFFF的字符集有时被成为基本多语言平面(BMP)。
 * 代码点大于U+FFFF的字符成为补充字符。
 * java平台在String和StringBuffer类中的char数组中使用UTF-16表示。
 * 在这个表示中,补充字符以2个char值表示。
 * 第一个来于高代理范围(\uD800-\uDBFF),第二个来自低代理范围(\uDC00-\uDFFF)。
 *
 * <p>一个char值,因此,代表了BMP的代码点,包括代理代码点或者UTF-16编码的代码单元。
 * 一个int值(32位)代表了所有的Unicode代码点,包括补充代码点。
 * int的低位的21bit被用来代表Unicode代码点,高位的11bit一定是0.
 * 除非另外指定,补充字符和代理值的行为如下:
 * 
 * <p>自我理解:可以这样认为,一个int32位,一个char16位,一个代码单元16位,一个代码点16位或32位。
 * 一个char对应一个代码单元,一个char对应16位的代码点和32位代码点的代理代码点(16位的)。
 * 而一个int,无论如何,都能代表一个代码点。
 * 有些字符需要两个char表示,一个char可能仅仅是某个字符的一半。
 *
 * <ul>
 * <li>仅仅接受一个char值的方法不能接受代理字符。
 * 它们视代理字符的char值作为未定义的字符。
 * 例如{@code Character.isLetter('\u005CuD840')} 返回false。
 * 即使这个特定的值后面跟着任何低代理的值都能作为一个字符。
 * 
 *
 * <li>接受一个int值的方法支持左右Unicode字符,包括补充字符。
 * 例如,{@code Character.isLetter(0x2F81A)}返回true,
 * 因为这个代码点的值对应一个字符。
 * </ul>
 *
 * <p>在Java SE API的文档内,Unicode代码点用于值对应在U+0000 到 U+10FFFF 的字符(最大的超过16bit)。
 * Unicode代码单元用于UTF-16编码的16bit的char值。
 * 更多的Unicode的问题可以看,http://www.unicode.org/glossary/
 *
 * @author  Lee Boynton
 * @author  Guy Steele
 * @author  Akira Tanaka
 * @author  Martin Buchholz
 * @author  Ulf Zibis
 * @since   1.0
 */
public final
class Character implements java.io.Serializable, Comparable<Character>

属性

进制相关-radix

    /**
     * 转换成字符串和从字符串转换的可行的最小的radix。
     * 这个字段的常量值是最小的radix转换方法的radix参数,如digit方法,forDigit方法,Integer的toString方法。
     * 
     *
     * @see     Character#digit(char, int)
     * @see     Character#forDigit(int, int)
     * @see     Integer#toString(int, int)
     * @see     Integer#valueOf(String)
     */
    public static final int MIN_RADIX = 2;

    /**
     * 转换成字符串和从字符串转换的可行的最大的radix。
     * 这个字段的常量值是最大的radix转换方法的radix参数,如digit方法,forDigit方法,Integer的toString方法。
     *
     * @see     Character#digit(char, int)
     * @see     Character#forDigit(int, int)
     * @see     Integer#toString(int, int)
     * @see     Integer#valueOf(String)
     */
    public static final int MAX_RADIX = 36;

字符大小相关

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值