美文网首页
java基础类-2-char

java基础类-2-char

作者: 宠辱不惊的咸鱼 | 来源:发表于2019-10-01 09:13 被阅读0次

Unicode

概述

class-001.jpg
  • 字符集
    • 为每个字符分配唯一数字
  • 代码点
    • 仅与字符集相关,与编码方式无关
    • 字符集中代表字符的那个数字编号;A:U+0041
    • Unicode代码点可以分为17个代码级别
      • 第一个代码级别称为基本的多语言级别,代码点从U+0000到U+FFFF,其中包括了经典的Unicode代码
      • 其余的16个附加级别,代码点从U+10000到U+10FFFF,包括了一些增补字符
  • 代码单元
    • 与编码方式有关
    • 可以理解为字符编码的一个基本单元,比如UTF-8是1个字节,UTF-16是2个字节
  • 增补字符
    • 16位编码的所有65536个字符不能完全表示全世界所有正在使用或曾经使用的字符
    • Unicode标准已扩展到包含多达1112064个字符
    • 超出原来16位限制的字符被称作增补字符
    • U+0000至U+FFFF之间的字符集被称为基本多语言面(BMP Basic Multilingual Plane)
    • 每一个Unicode字符要么属于BMP,要么属于增补字符

UCS-4

  • 如果UCS-4的前两个字节为全零,那么去掉前面的两个零字节就得到了UCS-2
  • 根据最高位为0的最高字节分成2^7=128个group
    • 每个group再根据次高字节分为256个平面(plane)
      • 每个平面根据第3个字节分为256行(row)
        • 每个平面有2^16=65536个码位,即每行256个码位(cell)
  • Unicode计划使用了17个平面,一共有17×65536=1114112个码位
  • 在Unicode5.0.0版本中,已定义的码位只有238605个,分布在平面0、平面1、平面2、平面14、平面15、平面16
  • 其中平面15和平面16上只是定义了两个各占65534个码位的专用区(Private Use Area),分别是0xF0000-0xFFFFD和0x100000-0x10FFFD
  • 所谓专用区,就是保留给大家放自定义字符的区域,可以简写为PUA
  • group 0的平面0被称作BMP(Basic Multilingual Plane)
    • 平面0也有一个专用区:0xE000-0xF8FF,有6400个码位
    • 平面0的0xD800-0xDFFF,共2048个码位,是一个被称作代理区(Surrogate)的特殊区域
      • 代理区目的在于使用两个UTF-16字符表示BMP以外的字符
  • 如前所述在Unicode 5.0.0版本中,238605-65534*2-6400-2048=99089
    • 余下的99089个已定义码位分布在平面0、平面1、平面2和平面14上,其中包括71226个汉字
      • 52080 + 3419 + 43253 + 337
        • 平面2的43253个字符都是汉字
        • 平面0上定义了27973个汉字
  • Unicode中:汉字“字”对应的数字是23383(十进制),十六进制表示为5B57
  • Unicode中,我们有很多方式将数字23383表示成程序中的数据,包括:UTF-8、UTF-16、UTF-32

UTF

概述

  • Unicode Transformation Format,Unicode字符集转换格式,即将Unicode定义的数字转换成程序数据

UTF-8

  • 变长编码
// Unicode编码                UTF-8字节流
00000000 - 0000007F             0xxxxxxx
00000080 - 000007FF             110xxxxx 10xxxxxx
00000800 - 0000FFFF             1110xxxx 10xxxxxx 10xxxxxx
00010000 - 001FFFFF             11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
00200000 - 03FFFFFF             111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 
04000000 - 7FFFFFFF             1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
  • UTF-8编码最大长度是6个字节,6字节模板有31个x,可容纳31位二进制数字
  • 与Unicode的最大码位0x7FFFFFFF相对应

UTF-16

  • 以16位无符号整数为单位
  • 我们把Unicode字符记作U,编码规则如下
    • 如果U<0x10000,U的UTF-16编码就是U对应的16位无符号整数(为书写简便,下文将16位无符号整数记作WORD)
    • 如果U≥0x10000,我们先计算U'=U-0x10000,然后将U'写成二进制形式:yyyy yyyy yyxx xxxx xxxx
    • U的UTF-16编码就是:1101 10yy yyyy yyyy 1101 11xx xxxx xxxx
    • 为什么U'可以被写成20个二进制位?
      • Unicode的最大码位是0x10ffff,减去0x10000后,U'的最大值是0xfffff,所以肯定可以用20个二进制位表示
    • 例如:Unicode字符0x20C30
      • 减去0x10000后,得到0x10C30,写成二进制是:0001 0000 1100 0011 0000
      • 用前10位依次替代模板中的y,用后10位依次替代模板中的x
      • 得到:11011000 01000011 11011100 00110000
      • 即0xD843 0xDC30

UTF-32

  • 以32位无符号整数为单位,Unicode的UTF-32编码就是其对应的32位无符号整数

相关文章

  • java基础类-2-char

    Unicode 概述 字符集为每个字符分配唯一数字 代码点仅与字符集相关,与编码方式无关字符集中代表字符的那个数字...

  • Java基础:类加载器

    系列阅读 Java基础:类加载器 Java基础:反射 Java基础:注解 Java基础:动态代理 1. 什么是类加...

  • Java基础:反射

    反射注解动态代理相关阅读 Java基础:类加载器 Java基础:反射 Java基础:注解 Java基础:动态代理 ...

  • Java基础:注解

    系列阅读 Java基础:类加载器 Java基础:反射 Java基础:注解 Java基础:动态代理 1. 概述 注解...

  • Java基础:动态代理

    系列阅读 Java基础:类加载器 Java基础:反射 Java基础:注解 Java基础:动态代理 概述 在运行时,...

  • Java常用包和第三方jar包

    一、Java常用包 java.lang--语言包:Java语言的基础类,包括Object类、Thread类、Str...

  • Android代码规范(自用)

    命名规范和排版 java成员类 基础类型优先排在上方 java相关类排在基础类型下方 android相关类排在ja...

  • 事件类

    事件类 1.java.lang.object类 java.util.EventObject 类是所有事件对象的基础...

  • ##Java学习笔记之基础类库笔记

    Java学习笔记之基础类库笔记 Object 所有类,数组,枚举类的父类 Objects(Java7新增) 工具类...

  • java基础学习:JavaWeb之Servlet

    其他更多java基础文章:java基础学习(目录) 什么是Servlet Servlet是一个特殊的Java类, ...

网友评论

      本文标题:java基础类-2-char

      本文链接:https://www.haomeiwen.com/subject/dplkpctx.html