java 字符之Unicode和UTF_8

java 字符之Unicode和UTF_8

最重要的一点 unicode是字符集 而 UTF-8、UTF-16都是编码

  1. 首先 什么是字符集
    如Ascii码表 十进制的48对应 字符0、 65对应a
    Ascii码表共有128个字符,使用一个字节的后7位,第一位置为0
    这种简单 的一一对应的关系就是字符集。相当于定义了一个字符数组,编码值相当于index下标,然后通过index取到唯一字符。

  2. 然后再来谈谈编码

  • 上述只描述了ascii码的码表,那么对于ascii的编码呢(emmmm,怎么说呢 要写篇原创的稿子 那必须,自己认为什么就是什么对吧)我认为可以说ascii没有编码 它固定了每个字符的长度为1,并且每一个码值对应一个字符,不需要其他的映射关系,要说的话,它唯一特殊一点就是强制规定了每个字节的第一位为0,给其他编码留下了余地,也确定了它占据前128个字符不容置疑的地位
  1. 然后,接下来是UTF-16
    居然不是Utf-8? 是的,UTF-16其实比UTF-8更简单,他通过固定每一个在对应2字节(16位),总共从unicode字符集中映射出来了 2^16(65536)个字符,可以说是单纯从字符量上面扩张了Ascii码,
  • 中文范围 4E00-9FA5:CJK 统一表意符号 (CJK Unified Ideographs)-------来自百度百科
    • 范围换算为19968-40869 也就是说可以通过UTF-16的记录约2w中文字符
    • 中文字符占了UTF-16的1/3…
  1. 然后是UTF-8
    • 其实UTF-8可以算是为了缩短字符所占据的字节量才产出的吧。
    • 它采用的可变长的字节量来计算每一个码值对应的字符
      看下表可以得到
      • 第一梯队就是ascii,它使用一个字节,表述了128个字符
      • 然后是 2^7 - 2^11 即前2048个字符,使用了2个字节
      • 然后 2^11 - 2^17 前65536个字符,使用了3个字节 (所以我们的中文字符都是三个字节的,不得不说我们为美帝的数据传输做出了贡献)
      • 然后 65536- 使用四个字节(目前unicode字符已经超过90000个)
Unicode编码(十六进制)UTF-8 字节流(二进制)
000000-00007F0xxxxxxx
000080-0007FF110xxxxx 10xxxxxx
000800-00FFFF1110xxxx 10xxxxxx 10xxxxxx
010000-10FFFF11110xxx10xxxxxx10xxxxxx10xxxxxx
utf-8utf-16
10110000100000000 01100001
1110 0100 10 111000 10 10110101001110 00101101
  • 将上诉加粗字体组合起来就是我们的utf-16的编码,而这个值就是对应的字符的编码值。

  1. 对于代码
    • char类型占据两个字节,使用unicode编码?
    • new String(bytes[], Charset)
      • 根据字符集,将byte数组转化为String字符串
    • String.getBytes(Charset)
      • 根据字符集 char转化为 byte数组
      • 中文字节长度为3 英文为1(utf-8).
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值