我需要编写一个java代码,将html保存到txt文件中。
问题是 UTF-8 中的特殊字符被破坏。
像“Hamamélis”这样的词会以“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();
有人可以给我建议一个解决方案吗?
最佳答案
一个可能的错误是在第一段代码的第四行中省略了“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
关于java - 如何将带有特殊字符 (UTF-8) 的 HTML 页面保存到 txt 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12224601/