万万没想到(Java字符串转long)Java字符串转时间格式,java字符串转码问题:从utf-8转到gbk再转回utf-8为什么会出现部分乱码呢?,java gbk转utf8 乱码,
假设啊(具体不是酱紫的啊,内部还比较复杂),每个字用UTF-8编码需要使用3个字节,每个字用GBK编码需要2个字节。
好,我们现在开始转换:
先看这个吧,a.getBytes("utf-8"),"gbk"
把这三个字用UTF-8翻译成字节数组,嗯,翻译后占9个字节把上面的字节数组用GBK翻译成字符串,每次取出两个字节翻译成一个字,于是前8个字节似乎没有什么太大问题(其实有问题,下面说),翻译成了4个字。然后只剩一个字节了,这要怎么搞,人家自己会给你加一个字节,凑成两个,然后再翻译。也就是说一共有5个字对吧,你看看你的输出:鎴戝緢濂�再看下面这个,b.getBytes("gbk"),"utf-8"
把“鎴戝緢濂�”用GBK翻译成字节数组,这个没什么问题吧,就翻译成了上面那10个字节(最后一个字节是他自己加的)
把这10个字节用UTF-8翻译成字符串,先取出三个,翻译成了我,再取出三个,翻译成了很,再取出三个,似乎没有翻译成好啊,问题在哪?上面说的“其实有问题就在这里”,你那随便取的两个字节,我这GBK就一定有对应的字啊,没有对应的怎么办,找一个比较接近的代替,也就是说原来的字节数组被改变了。所以这里在翻译回去就出了问题。最后还剩一个字节啊(就是上面他自己加的那个),这里要三个字节才能翻译啊,那就再加两个呗,就凑成三个了,于是这个可想而知要翻译成什么乱七八糟的玩意儿。所以就上面的分析可以引出的问题有俩:
翻译成字符串时,取出若干个字节,发现我这个码表里面没有与之对应的字,使用其他接近的代替前面每次取出几个来翻译都很开心,最后发现不够了,要自己加几个字节才能翻译一般使用Tomcat的时候,他默认使用ISO-8859-1(这是Servlet规范要求的)给你解析,明显中文就要乱码,出现这个乱码了,可以怎么搞啊:
String a = "我很好";String b=new String(a.getBytes("utf-8"),"ISO-8859-1");System.out.println(b);String c=new String(b.getBytes("ISO-8859-1"),"utf-8");System.out.println(c);
很多老师或者老湿机会给你这么说吧,这个一点问题都没有。ISO-8859-1一次只要一个字节,而且使用了单字节内的所有空间,换句话说随便拿一个字节,我都能给你翻译,不会出现问题1所说的现象;他每次只要一个字节,自然就不会有问题2所说的现象,所以这是ok的。
菜鸟强答,有什么不对的要指出来啊。
版权申明
本文系作者 @河马 原创发布在河马博客站点。未经许可,禁止转载。
暂无评论数据