我需要做一个java代码,保存一个html到一个txt文件。
问题是UTF-8中的特殊字符被破坏了。
像"Hamamélis“这样的单词就被保存为”“。
下面列出了我编写的代码:
URLConnection conn;
conn = site.openConnection();
conn.setReadTimeout(10000);
Charset charset = Charset.forName("UTF8");
BufferedReader in = new BufferedReader( new InputStreamReader( conn.getInputStream(), "UTF-8" ) );
buff = in.readLine();在此之后:
out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(Nome), "UTF-8"));
out.write(buff);
out.close();有人能给我一个解决方案吗?
发布于 2012-09-01 14:58:48
一个可能的错误是在第一段代码的第4行省略了"UTF-8“中的连字符。请参阅CharSet文档。
否则,代码看起来是正确的。但是我们当然不能直接测试它,因为我们没有你的数据。
为了便于比较,下面是我编写的一个小类。以与您的代码类似的方式,这个类正确地将您的"Hamamélis“示例的重音'e‘写为UTF-8中单个(非规范化)字符的两个八位字节:十六进制的'C3’和'A9‘。
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.io.BufferedWriter;
import java.io.IOException;
public class ReaderWriter {
public static void main(String[] args) {
try {
String content = "Hamamélis. Written: " + new java.util.Date();
File file = new File("some_text.txt");
// Create file if not already existent.
if (!file.exists()) {
file.createNewFile();
}
FileOutputStream fileOutputStream = new FileOutputStream( file );
OutputStreamWriter outputStreamWriter = new OutputStreamWriter( fileOutputStream, "UTF-8" );
BufferedWriter bufferedWriter = new BufferedWriter( outputStreamWriter );
bufferedWriter.write( content );
bufferedWriter.close();
System.out.println("ReaderWriter 'main' method is done. " + new java.util.Date() );
} catch (IOException e) {
e.printStackTrace();
}
}
}正如icktoofay评论的那样,你应该更深入地挖掘,以确切地发现涉及到哪些八位字节。使用十六进制编辑器,就像我今天在Mac app Store上找到的"File Viewer“应用程序一样,可以查看保存文件中的确切八位字节。
如果二进制八位数是C3和A9,那么问题很简单,您用来将文件视为文本的文本编辑器使用了错误的字符编码。例如,您可以在web浏览器中打开该文本文件,然后使用其菜单命令将该文件重新解释为UTF-8。
如果二进制八位数不是C3 & A9,我将进一步检查输入的二进制八位数。
如果您不理解计算机中的文本文件实际上包含数字(而不是人类意义上的文本),那么可以从编码中抽出时间来阅读这篇有趣的文章:The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!) by Joel Spolsky
https://stackoverflow.com/questions/12224601
复制相似问题