new String(str.getBytes("gbk"),"utf-8").纠正八楼的一个观点,str.getBytes("gbk")这一句是用gbk编码,而不是gbk解码,jvm对于字符有内部编码,是一个utf-8的变体版本,jvm不认识其它编码,而这一句的含义在于把jvm内部编码转换成gbk编码的一个byte数组。而new String(byte,"utf-8")的含义是,使用utf-8解码用utf-8编码的一个byte数组为jdk内部编码。 new String(str.getBytes("gbk"),"utf-8"). 这一句纯粹属于扯淡,先把一个字符串编码成gbk,然后再用utf-8进行解码,无论什么情况,都是乱码..... 最后解释一下new String(str.getBytes("iso-8859-1"),"utf-8"),iso-8859-1是个特例,它表示的是原始编码,这种编码不会改变原始数据,虽然它不能正确解析,但是不会改变数据本身,因此很多时候会看见这种解析方式。
用InputStreamReader isr=new InputStreamReader(input,"utf-8")对输入流进行编码。
然后将读取字符串直接输出就可以了。
用InputStreamReader isr=new InputStreamReader(input,"utf-8")对输入流进行编码。
然后将读取字符串直接输出就可以了。这样就可以呀,为什么要把它弄成String,再转啊
问题就是上面说的这样的。上面我说默认用gbk解码,是我猜测的因为我没具体看到你的代码。也有可能你按照别的字符集进行的解码。但是道理是一样的。别的你应该也会改。
但是最好的方式还是像2楼说的那样,接受的时候就做相应的设置。
如果你没有使用那个类进行转码,那么会被隐式的使用它转码,但是它的默认麻是提取的操作系统默认编码,windows系列的默认编码都是gbk,转码会不正常是显然的,而且转码是不可以失败的,一旦失败就再也转不回来了。
new String(str.getBytes("gbk"),"utf-8"). 这一句纯粹属于扯淡,先把一个字符串编码成gbk,然后再用utf-8进行解码,无论什么情况,都是乱码.....
最后解释一下new String(str.getBytes("iso-8859-1"),"utf-8"),iso-8859-1是个特例,它表示的是原始编码,这种编码不会改变原始数据,虽然它不能正确解析,但是不会改变数据本身,因此很多时候会看见这种解析方式。
道理非常简单。
跟你说,编码问题没有特例。只是编码解码的问题。jvm中只有unicode编码大家都知道,不用强调,而且不是utf-8的实现。是utf-16 至于大端小端,没研究过。
顶jiakai0419,各项说的很正确!