当前位置:   article > 正文

java基础类Character源码分析_\u005cuffff

\u005cuffff

目录

简介

属性

进制相关-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,要么属于增补字符。

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

属性

进制相关-radix

  1. /**
  2. * 转换成字符串和从字符串转换的可行的最小的radix。
  3. * 这个字段的常量值是最小的radix转换方法的radix参数,如digit方法,forDigit方法,Integer的toString方法。
  4. *
  5. *
  6. * @see Character#digit(char, int)
  7. * @see Character#forDigit(int, int)
  8. * @see Integer#toString(int, int)
  9. * @see Integer#valueOf(String)
  10. */
  11. public static final int MIN_RADIX = 2;
  12. /**
  13. * 转换成字符串和从字符串转换的可行的最大的radix。
  14. * 这个字段的常量值是最大的radix转换方法的radix参数,如digit方法,forDigit方法,Integer的toString方法。
  15. *
  16. * @see Character#digit(char, int)
  17. * @see Character#forDigit(int, int)
  18. * @see Integer#toString(int, int)
  19. * @see Integer#valueOf(String)
  20. */
  21. public static final int MAX_RADIX = 36;

字符大小相关

  1. /**
  2. * 这个字段的常量值是char的最小值 {@code '\u005Cu0000'}
  3. *
  4. * @since 1.0.2
  5. */
  6. public static final char MIN_VALUE = '\u0000';
  7. /**
  8. * 这个字段的常量值是char的最小值 {@code '\u005CuFFFF'}
  9. * 注意:char是16位的,所以对应4个16进制的数字。
  10. *
  11. * @since 1.0.2
  12. */
  13. public static final char MAX_VALUE = '\uFFFF';

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

  1. /**
  2. * Unicode 的UTF-16编码的高代理代码单元的最小值,常量{@code '\u005CuD800'}
  3. * 一个高代理同样也是一个领导代理。
  4. *
  5. * @since 1.5
  6. */
  7. public static final char MIN_HIGH_SURROGATE = '\uD800';
  8. /**
  9. * Unicode 的UTF-16编码的高代理代码单元的最大值,常量{@code '\u005CuDBFF'}
  10. * 一个高代理同样也是一个领导代理。
  11. *
  12. * @since 1.5
  13. */
  14. public static final char MAX_HIGH_SURROGATE = '\uDBFF';
  15. /**
  16. * Unicode 的UTF-16编码的低代理代码单元的最小值,常量{@code '\u005CuDC00'}
  17. * 一个低代理同样也是一个跟随代理。
  18. * 可以看到高代理和低代理是连起来的,先是高代理,然后是低代理。
  19. *
  20. * @since 1.5
  21. */
  22. public static final char MIN_LOW_SURROGATE = '\uDC00';
  23. /**
  24. * Unicode 的UTF-16编码的低代理代码单元的最大值,常量{@code '\u005CuDFFF'}
  25. * 一个低代理同样也是一个跟随代理。
  26. *
  27. * @since 1.5
  28. */
  29. public static final char MAX_LOW_SURROGATE = '\uDFFF';
  30. /**
  31. * Unicode 的UTF-16编码的代理代码单元的最小值,常量{@code '\u005CuD800'}
  32. * 可以看到高代理和低代理是连起来的,先是高代理,然后是低代理。
  33. *
  34. * @since 1.5
  35. */
  36. public static final char MIN_SURROGATE = MIN_HIGH_SURROGATE;
  37. /**
  38. * Unicode 的UTF-16编码的代理代码单元的最大值,常量{@code '\u005CuDFFF'}
  39. *
  40. * @since 1.5
  41. */
  42. public static final char MAX_SURROGATE = MAX_LOW_SURROGATE;
  43. /**
  44. * Unicode补充代码点的最小值,常量{@code U+10000}
  45. * @since 1.5
  46. */
  47. public static final int MIN_SUPPLEMENTARY_CODE_POINT = 0x010000;
  48. /**
  49. * Unicode代码点的最小值,常量{@code U+0000}
  50. *
  51. * @since 1.5
  52. */
  53. public static final int MIN_CODE_POINT = 0x000000;
  54. /**
  55. * Unicode代码点的最大值,常量{@code U+10FFFF}
  56. * @since 1.5
  57. */
  58. public static final int MAX_CODE_POINT = 0X10FFFF;

基础属性

  1. /**
  2. * Character的值
  3. *
  4. * @serial
  5. */
  6. private final char value;
  7. /** use serialVersionUID from JDK 1.0.2 for interoperability */
  8. private static final long serialVersionUID = 3786198910865385080L;

char与位,字节相关

  1. /**
  2. * 用来表示一个char值在无符号的二进制形式下,使用的bit(位)的数量,常量16
  3. *
  4. * @since 1.5
  5. */
  6. public static final int SIZE = 16;
  7. /**
  8. * 用来表示一个char值在无符号的二进制形式下,使用的byte(字节)的数量,常量2
  9. *
  10. * @since 1.8
  11. */
  12. public static final int BYTES = SIZE / Byte.SIZE;

构造方法

构造器

  1. /**
  2. * 创建一个新分配的Character对象,代表指定的char值
  3. *
  4. * @param value the value to be represented by the
  5. * {@code Character} object.
  6. */
  7. public Character(char value) {
  8. this.value = value;
  9. }

valueOf与缓存

  1. /** CharacterCache里面缓存着char的代码点对应[0,127]的Character实例
  2. *
  3. */
  4. private static class CharacterCache {
  5. private CharacterCache(){}
  6. static final Character cache[] = new Character[127 + 1];
  7. static {
  8. for (int i = 0; i < cache.length; i++)
  9. //[0,127]
  10. cache[i] = new Character((char)i);
  11. }
  12. }
  13. /**
  14. * <p>返回一个Character实例,代表指定的char值。
  15. * 如果不需要一个新的Character实例,这个方法好于new Character(char)方法,
  16. * 因为这个方法可能导致更好的空间和时间效率,通过缓存被频繁访问的值。
  17. *
  18. * <p>这个方法将总是缓存从{@code'\u005Cu0000'}到{@code '\u005Cu007F'}[0,127]的值。
  19. *
  20. * @param c a char value.
  21. * @return a <tt>Character</tt> instance representing <tt>c</tt>.
  22. * @since 1.5
  23. */
  24. public static Character valueOf(char c) {
  25. if (c <= 127) { // must cache
  26. return CharacterCache.cache[(int)c];
  27. }
  28. return new Character(c);
  29. }

基本方法

返回char

  1. /**
  2. * 返回Character对象的值
  3. * @return the primitive {@code char} value represented by
  4. * this object.
  5. */
  6. public char charValue() {
  7. return value;
  8. }

hashcode

  1. /**
  2. * 返回这个Character的hashcode,与调用charValue()的结果相同(就是返回这个Character的char值)
  3. *
  4. * @return a hash code value for this {@code Character}
  5. */
  6. @Override
  7. public int hashCode() {
  8. return Character.hashCode(value);
  9. }
  10. /**
  11. * 返回一个char值的hashcode,与{@code Character.hashCode()}匹配
  12. *
  13. * @since 1.8
  14. *
  15. * @param value The {@code char} for which to return a hash code.
  16. * @return a hash code value for a {@code char} value.
  17. */
  18. public static int hashCode(char value) {
  19. //value强转成int
  20. return (int)value;
  21. }

equal

  1. /**
  2. * 与指定对象比较。
  3. * 当且仅当参数不是null而且是一个Character,代表与这个对象相同的char值,才返回true
  4. *
  5. *
  6. * @param obj the object to compare with.
  7. * @return {@code true} if the objects are the same;
  8. * {@code false} otherwise.
  9. */
  10. public boolean equals(Object obj) {
  11. if (obj instanceof Character) {
  12. //比较value与obj强转Character的char值
  13. return value == ((Character)obj).charValue();
  14. }
  15. return false;
  16. }

toString

  1. /**
  2. * 返回一个代表这个Character的值的String对象。
  3. * 这个对象的长度为1,唯一的成员是代表这个Character的char值。
  4. *
  5. * @return a string representation of this object.
  6. */
  7. public String toString() {
  8. char buf[] = {value};
  9. return String.valueOf(buf);
  10. }
  11. /**
  12. * 返回一个代表指定char值的String对象。
  13. * 这个对象的长度为1,唯一的成员是代表这个Character的char值。
  14. *
  15. * @param c the {@code char} to be converted
  16. * @return the string representation of the specified {@code char}
  17. * @since 1.4
  18. */
  19. public static String toString(char c) {
  20. return String.valueOf(c);
  21. }

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

判断代码点

  1. /**
  2. * 确定指定的代码点是否是一个合法的Unicode代码点
  3. *
  4. * @param codePoint the Unicode code point to be tested
  5. * @return {@code true} if the specified code point value is between
  6. * {@link #MIN_CODE_POINT} and
  7. * {@link #MAX_CODE_POINT} inclusive;
  8. * {@code false} otherwise.
  9. * @since 1.5
  10. */
  11. public static boolean isValidCodePoint(int codePoint) {
  12. // 普通的确定形式为:
  13. // codePoint >= MIN_CODE_POINT && codePoint <= MAX_CODE_POINT
  14. // codePoint >= 0x000000 && codePoint <= 0X10FFFF
  15. int plane = codePoint >>> 16; //移去16位,只剩左边的16位
  16. return plane < ((MAX_CODE_POINT + 1) >>> 16); //plane小于0X11即可
  17. }
  18. /**
  19. * 确定指定的代码点是否是一个BMP代码点。
  20. * 这样的代码点能以一个单独的char表示
  21. *
  22. * @param codePoint the character (Unicode code point) to be tested
  23. * @return {@code true} if the specified code point is between
  24. * {@link #MIN_VALUE} and {@link #MAX_VALUE} inclusive;
  25. * {@code false} otherwise.
  26. * @since 1.7
  27. */
  28. public static boolean isBmpCodePoint(int codePoint) {
  29. return codePoint >>> 16 == 0; //只要codePoint只有右边16位可能为1,左边16位全为0即为BMP
  30. //[0x0000,0xFFFF]
  31. // Optimized form of:
  32. // codePoint >= MIN_VALUE && codePoint <= MAX_VALUE
  33. // We consistently use logical shift (>>>) to facilitate
  34. // additional runtime optimizations.
  35. }
  36. /**
  37. * 确定指定的代码点是否是补充代码点。(即不是BMP代码点)
  38. *
  39. * @param codePoint the character (Unicode code point) to be tested
  40. * @return {@code true} if the specified code point is between
  41. * {@link #MIN_SUPPLEMENTARY_CODE_POINT} and
  42. * {@link #MAX_CODE_POINT} inclusive;
  43. * {@code false} otherwise.
  44. * @since 1.5
  45. */
  46. public static boolean isSupplementaryCodePoint(int codePoint) {
  47. return codePoint >= MIN_SUPPLEMENTARY_CODE_POINT
  48. && codePoint < MAX_CODE_POINT + 1;
  49. //[0x10000,10FFFF]
  50. }

判断代理代码单元

  1. /**
  2. * 确定给定的char值是否是一个Unicode高代理代码单元。
  3. * 这样的值不代表他们自己的字符,被用来代表UTF-16的补充字符。
  4. *
  5. * @param ch the {@code char} value to be tested.
  6. * @return {@code true} if the {@code char} value is between
  7. * {@link #MIN_HIGH_SURROGATE} and
  8. * {@link #MAX_HIGH_SURROGATE} inclusive;
  9. * {@code false} otherwise.
  10. * @see Character#isLowSurrogate(char)
  11. * @see Character.UnicodeBlock#of(int)
  12. * @since 1.5
  13. */
  14. public static boolean isHighSurrogate(char ch) {
  15. // Help VM constant-fold; MAX_HIGH_SURROGATE + 1 == MIN_LOW_SURROGATE
  16. //[\ud800,\udbff]
  17. return ch >= MIN_HIGH_SURROGATE && ch < (MAX_HIGH_SURROGATE + 1);
  18. }
  19. /**
  20. * 确定给定的char值是否是一个Unicode低代理代码单元。
  21. * 这样的值不代表他们自己的字符,被用来代表UTF-16的补充字符。
  22. *
  23. * @param ch the {@code char} value to be tested.
  24. * @return {@code true} if the {@code char} value is between
  25. * {@link #MIN_LOW_SURROGATE} and
  26. * {@link #MAX_LOW_SURROGATE} inclusive;
  27. * {@code false} otherwise.
  28. * @see Character#isHighSurrogate(char)
  29. * @since 1.5
  30. */
  31. public static boolean isLowSurrogate(char ch) {
  32. //[udc00,\udfff]
  33. return ch >= MIN_LOW_SURROGATE && ch < (MAX_LOW_SURROGATE + 1);
  34. }
  35. /**
  36. * 确定给定的char值是否是一个Unicode代理代码单元。
  37. * 这样的值不代表他们自己的字符,被用来代表UTF-16的补充字符。
  38. * 一个char值当且仅当它是一个低代理代码单元或者高代理代码单元时,他才是一个代理代码单元
  39. *
  40. *
  41. * @param ch the {@code char} value to be tested.
  42. * @return {@code true} if the {@code char} value is between
  43. * {@link #MIN_SURROGATE} and
  44. * {@link #MAX_SURROGATE} inclusive;
  45. * {@code false} otherwise.
  46. * @since 1.7
  47. */
  48. public static boolean isSurrogate(char ch) {
  49. return ch >= MIN_SURROGATE && ch < (MAX_SURROGATE + 1);
  50. //[\ud800,\udfff]
  51. }
  52. /**
  53. * 确定指定的一对char是否是一个合法的Unicode代理对。
  54. * 这个方法与下面相同:
  55. * <blockquote><pre>{@code
  56. * isHighSurrogate(high) && isLowSurrogate(low)
  57. * }</pre></blockquote>
  58. *
  59. * @param high the high-surrogate code value to be tested
  60. * @param low the low-surrogate code value to be tested
  61. * @return {@code true} if the specified high and
  62. * low-surrogate code values represent a valid surrogate pair;
  63. * {@code false} otherwise.
  64. * @since 1.5
  65. */
  66. public static boolean isSurrogatePair(char high, char low) {
  67. return isHighSurrogate(high) && isLowSurrogate(low);
  68. }

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

  1. /**
  2. * 确定表示这个代码点需要的char的个数。
  3. * 如果指定的字符大于等于0x10000,返回2,否则返回1。
  4. * 这个方法没有验证指定的字符是否是一个合法的Unicode代码点。
  5. * 调用者如果需要,使用isValidCodePoint验证
  6. *
  7. * @param codePoint the character (Unicode code point) to be tested.
  8. * @return 2 if the character is a valid supplementary character; 1 otherwise.
  9. * @see Character#isSupplementaryCodePoint(int)
  10. * @since 1.5
  11. */
  12. public static int charCount(int codePoint) {
  13. return codePoint >= MIN_SUPPLEMENTARY_CODE_POINT ? 2 : 1;
  14. //[0,U+10000)->1
  15. }
  16. /**
  17. * 将指定的代理对转为对应的补充代码点。
  18. * 这个方法不验证指定的代理对,调用者如果需要,必须使用isSurrogatePair来验证。
  19. *
  20. * @param high the high-surrogate code unit
  21. * @param low the low-surrogate code unit
  22. * @return the supplementary code point composed from the
  23. * specified surrogate pair.
  24. * @since 1.5
  25. */
  26. public static int toCodePoint(char high, char low) {
  27. // Optimized form of:
  28. // return ((high - MIN_HIGH_SURROGATE \ud800 ) << 10)
  29. // + (low - MIN_LOW_SURROGATE \udc00)
  30. // + MIN_SUPPLEMENTARY_CODE_POINT 0x10000;
  31. //high和low都为对应min时,为0x10000
  32. //下面的就是上面的变种
  33. return ((high << 10) + low) + (MIN_SUPPLEMENTARY_CODE_POINT
  34. - (MIN_HIGH_SURROGATE << 10)
  35. - MIN_LOW_SURROGATE);
  36. }
  1. /**
  2. * 返回指定字符在UTF-16编码中的高代理代码单元。
  3. * 如果指定字符不是一个补充字符,回访一个无法定义的char。
  4. * 如果isSupplementaryCodePoint(x)返回true,
  5. * 则isHighSurrogate(highSurrogate(x))和toCodePoint(highSurrogate(x), lowSurrogate(x)) == x 永远为true
  6. *
  7. * @param codePoint a supplementary character (Unicode code point)
  8. * @return the leading surrogate code unit used to represent the
  9. * character in the UTF-16 encoding
  10. * @since 1.7
  11. */
  12. public static char highSurrogate(int codePoint) {
  13. return (char) ((codePoint >>> 10)
  14. + (MIN_HIGH_SURROGATE - (MIN_SUPPLEMENTARY_CODE_POINT >>> 10)));
  15. }
  16. /**
  17. * 返回指定字符在UTF-16编码中的低代理代码单元。
  18. * 如果指定字符不是一个补充字符,回访一个无法定义的char。
  19. * 如果isSupplementaryCodePoint(x)返回true,
  20. * 则isLowSurrogate(lowSurrogate(x))和toCodePoint(highSurrogate(x), lowSurrogate(x)) == x 永远为true
  21. *
  22. * @param codePoint a supplementary character (Unicode code point)
  23. * @return the trailing surrogate code unit used to represent the
  24. * character in the UTF-16 encoding
  25. * @since 1.7
  26. */
  27. public static char lowSurrogate(int codePoint) {
  28. return (char) ((codePoint & 0x3ff) + MIN_LOW_SURROGATE);
  29. }

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/100143?site
推荐阅读
相关标签
  

闽ICP备14008679号