美文网首页
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

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