java 字符之Unicode和UTF_8
最重要的一点 unicode是字符集 而 UTF-8、UTF-16都是编码
-
首先 什么是字符集
如Ascii码表 十进制的48对应 字符0、 65对应a
Ascii码表共有128个字符,使用一个字节的后7位,第一位置为0
这种简单 的一一对应的关系就是字符集。相当于定义了一个字符数组,编码值相当于index下标,然后通过index取到唯一字符。 -
然后再来谈谈编码
- 上述只描述了ascii码的码表,那么对于ascii的编码呢(emmmm,怎么说呢 要写篇原创的稿子 那必须,自己认为什么就是什么对吧)我认为可以说ascii没有编码 它固定了每个字符的长度为1,并且每一个码值对应一个字符,不需要其他的映射关系,要说的话,它唯一特殊一点就是强制规定了每个字节的第一位为0,给其他编码留下了余地,也确定了它占据前128个字符不容置疑的地位
- 然后,接下来是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…
- 然后是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-00007F | 0xxxxxxx |
000080-0007FF | 110xxxxx 10xxxxxx |
000800-00FFFF | 1110xxxx 10xxxxxx 10xxxxxx |
010000-10FFFF | 11110xxx10xxxxxx10xxxxxx10xxxxxx |
值 | utf-8 | utf-16 |
---|---|---|
1 | 01100001 | 00000000 01100001 |
中 | 1110 0100 10 111000 10 101101 | 01001110 00101101 |
- 将上诉加粗字体组合起来就是我们的utf-16的编码,而这个值就是对应的字符的编码值。
- 对于代码
- char类型占据两个字节,使用unicode编码?
- new String(bytes[], Charset)
- 根据字符集,将byte数组转化为String字符串
- String.getBytes(Charset)
- 根据字符集 char转化为 byte数组
- 中文字节长度为3 英文为1(utf-8).