UTF-8 Unicode是如何转换的

 1. Unicode转UTF-8

       UTF-8的特点是对不同范围的字符使用不同长度的编码。对于 0x00-0x7F之间的字符,UTF-8编码与ASCII编码完全相同。UTF-8编码的最大长度是4个字节。从表3-2可以看出,4字节模板有21个 x,即可以容纳21位二进制数字。Unicode的最大码位0x10FFFF也只有21位。
       如:“汉”字的Unicode编码是0x6C49。0x6C49在0x0800-0xFFFF之间,使用用3字节模板了:1110xxxx 10xxxxxx 10xxxxxx。将0x6C49写成二进制是:0110 1100 0100 1001,用这个比特流依次代替模板中的x,得到:11100110 10110001 10001001,即E6 B1 89。
       又如:Unicode编码0x20C30在0x010000-0x10FFFF之间,使用4字节模板了:11110xxx 10xxxxxx 10xxxxxx 10xxxxxx。将0x20C30写成21位二进制数字(不足21位就在前面补0):0 0010 0000 1100 0011 0000,用这个比特流依次代替模板中的x,得到:11110000 10100000 10110000 10110000,即F0 A0 B0 B0。

    上面一段是从网上copy下来的,现在说说我的理解和试验结果,由于闲着没事,就复习复习java 本人其实毕业后一直做的是.NET平台的东西,java在学校学的东西早就忘记的差不多了,不过高级语言变成大部分都差不多。我就用java写了一个FileInputStream和FileOutputStream的例子玩玩, 然后发现,输出流写出的汉字在文本文件里是可以正常显示的,但是我再用输入流来单个获取时却不知到怎么转换了,因为这个是字节流,(当然,将字节流转换为字符流在读取那是另一回事,那是java自己封装好了的,不然我也不会去整理字符集编码的问题了)我在想BufferedReader是怎么读取的。

    我本来输出到文本里的是“好好学习”四个汉字,用的是UTF-8编码。如果用FileInputStream.read()方法读取,“好”这个字返回的是三个字节数组:229 165 189.而用InputStreamReader.read()方法返回的是22909. 这里牵扯到字节流和字符流的概念,这个就不细说了,在网上可以找的到。那么我们就来看看这两组数字是怎么来的。

       好”这个字的Unicode编码是:\u597d。返回三个字节数组是通过Unicode的值得来的,我们用上面的公式套一下, \u597d写成二进制是:0101 1001 0111 1101,按照上面的公式套用后:11100101 10100101 10111101 。正好对应的十进制是:229 165 189.也就是通过字节流获得的UTF-8的字节值是这么来的。 

       那字符流的值是怎么来的呢,那就更简单了,将\u597d的二进制值 0101100101111101 这个值的十进制就是:22909.其实字符值就是个编码所对应的数值字面值。

      关于字符集的概念还很多,这只是个人的一部分小小测试所得结果。便于理解和记忆。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值