2

我需要制作一个将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();

任何人都可以建议我一个解决方案?

4

1 回答 1

2

一个可能的错误是在第一段代码的第 4 行中省略了“UTF-8”中的连字符。请参阅字符集文档。

否则,代码似乎是正确的。但是我们当然不能直接测试它,因为我们没有您的数据。

为了比较,这是我写的一个小类。以与您的代码类似的方式,此类正确地将您的“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 上找到的“文件查看器”应用程序这样的十六进制编辑器来查看您保存的文件中的确切八位字节。

如果八位位组是 C3 和 A9,那么问题只是您用来将文件视为文本的文本编辑器使用了错误的字符编码。例如,您可以在 Web 浏览器中打开该文本文件,并使用其菜单命令将文件重新解释为 UTF-8。

如果八位字节不是 C3 和 A9,我会进一步检查输入的八位字节。

如果您不了解计算机中的文本文件实际上包含数字(不是人类意义上的文本),那么请从编码中休息一下,阅读这篇有趣的文章: 每个软件开发人员绝对、肯定必须了解 Unicode 和字符集的绝对最小值(没有借口!)乔尔·斯波尔斯基

于 2012-09-01T06:58:48.187 回答