Java基础-char

本文详细介绍了Unicode编码系统,包括字符集的概念、代码点分配、基本多语言平面(BMP)与增补字符,以及UTF-8、UTF-16和UTF-32三种变长编码格式的示例和原理。
摘要由CSDN通过智能技术生成

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位无符号整数
  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Eddy咸鱼

感谢大佬加鸡蛋~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值