我需要创建一个将html保存为txt文件的java代码。
问题是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();
任何人都可以建议我一个解决方案吗?
答案 0 :(得分:1)
一个可能的错误是在第一段代码的第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