都过了半年了,又被字符编码搞了

 1     public static void getXmlSource(String link) throws IOException {
 2         // 用链接字符串new出URL对象
 3         URL url = new URL(link);
 4 
 5         // 输入输出流
 6         InputStream in = (InputStream) url.getContent();
 7         BufferedReader reader = new BufferedReader(new InputStreamReader(in, "UTF-8"));
 8         FileOutputStream out = new FileOutputStream("xml_resource.xml");
 9         OutputStreamWriter writer = new OutputStreamWriter(out, "UTF-8");
10 
11         // 读一行写一行
12         String line = null;
13         while ((line = reader.readLine()) != null) {
14             writer.write(line);;
15         }
16 
17         // 释放资源
18         writer.close();
19         out.close();
20         reader.close();
21         in.close();
22 
23         // 打印成功信息
24         System.out.println("OK");
25     }
先发结果

 作用是把指定URL连接到的XML文件下载下来。

一开始是全部乱码,我感觉大概是因为资源是UTF-8的,然后输出的不是,于是百度了一下,想把输出的内容先按UTF-8解码再输出,百度到的方法是用字符串的getBytes()方法把字符串转成字节数组,然后重新new一个字符串,用重载的构造方法加上编码类型作为参数,但是出现了很奇怪的情况,输出的文件里大部分显示正常了,但是有一部分内容是乱码,而且乱码的部分也不是生僻字也不是特殊符号的,这样想找办法都无从找起,于是只好另想办法。

后来发现构造输入流InputStreamReader的时候是可以加上编码作为参数的,一下子觉得找到办法了,于是果断按UTF-8来输入,然后原样输出,不行。

用上面的办法编码成GBK输出,不行。

编成UTF-8,不行。

症状是输出txt显示完全正常,但是输出成xml的话打开会报错,直接编辑会发现里面还是乱码。

最后就放弃了,上S1问了一下,没想到马上就有答案了……

输出文件不要用FileWriter,这样的话你输出的编码跟本机的OS和语言有关,用OutputStreamWriter输出,指定UTF-8编码

java的读写都要指定字符集, 不然默认都是操作系统的字符集来着..

在java里所有string都是用utf8存的, 只有转为byte串的时候才会转为相应的编码. 所以读取时候指定的字符集只决定了java用什么编码把byte[]转为string, 不影响你读取后存在内存里的string是什么字符集

结果问题出在细节上……

于是马上改了改代码,一下就成功了。

输入输出流都是可以指定字符集的,总之跟编码打交道的时候就不要偷懒用FileWriter了……

原文地址:https://www.cnblogs.com/chihane/p/3612230.html