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.其实字符值就是个编码所对应的数值字面值。
关于字符集的概念还很多,这只是个人的一部分小小测试所得结果。便于理解和记忆。