比如转化一个 "中文网", 写入后,打开显示有乱码, 但是如果是 "中文网d",就 可以成功,无乱码。BufferedWriter w = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(new File(fileName))));
w.write(new String("中文网".getBytes("utf-8"),"GBK"));为什么会这样呢, 怎么解决呢,谢谢。

解决方案 »

  1.   

    w.write(new String("中文网".getBytes("utf-8"),"utf-8"));//应该是这样
    “中文网”以utf-8方式编码成字节数组,只能以utf-8方式再转化成字符串才不会乱码
      

  2.   


    为什么要这么干? w.write("中文网"); 不行么?如果你要指定编码,也应该在 new OutputStreamWriter 时指定啊
      

  3.   

    试试下面的代码。如果你的系统编码不是GBK,OutPutStreamWriter应该设置正确的编码。

    BufferedWriter w = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(new File(fileName)),"GBK")); 
    w.write(new String("中文网".getBytes("utf-8"),"GBK"));
      

  4.   

    w.write(new String("中文网".getBytes("utf-8"),"GBK"));这样的写法是不对的,保存在虚拟机中的不是utf-8编码,而是utf-8编码变种,虚拟机的内部编码是固定的,不会改变。
    getBytes("utf-8")是把保存在虚拟机中的中文编码成utf-8格式,而不是虚拟机中本身就是utf-8编码,new String(byte,"gbk")也不是让虚拟机内部编码为gbk,而是虚拟机以gbk方式解析传入编码,然后将编码转换成内部编码(utf-8编码变种),根据这个道理,你用utf-8格式获得虚拟机内部编码类型,然后再用GBK解析utf-8格式的编码,当然不能解析。
    所以如果你要获得gbk的编码,必须要getBytes("GBK")才行,然后解析就用new String(byte,"gbk");
    你这种写法是有问题的 只有new String("中文网".getBytes("GBK"),"GBK")这种方法才正确,但是这么写又是没有意义的。
    不过有一个形式例外,就是new String(str.getBytes("ISO-8859-1"),"GBK"),为什么呢,因为这他们其实是同一种编码方式,只不过一个以英文编码方式解析,一个以中文方式解析而已。而utf-8与gbk根本就是两种编码方式,是不能互相解析的。
      

  5.   

    new String("中文网".getBytes("utf-8"),"utf-8")
    这句话做了什么?
      

  6.   

    OutputStreamWriter w = new OutputStreamWriter(new FileOutputStream(fileName),"gb2312");
       w.write("中文网");