【问题标题】:Java Convert UTF-8 Text File to Cp1250Java 将 UTF-8 文本文件转换为 Cp1250
【发布时间】:2014-03-13 15:27:08
【问题描述】:

我正在尝试将 UTF-8 文本文件转换为 Windows-1250。 我正在使用 Java 6 API。

我使用了下面的代码,但结果肯定不是 Cp1250。

import java.io.*; 

public class testing {
    public static void main (String[] args) throws IOException {   

        InputStream  input = null;
        OutputStreamWriter output = null;   

        File destinationFile = new File("C:\\test\\Cp1250.txt");   

        try {      
            input = new FileInputStream("C:\\test\\utf-8.txt");
            output = new OutputStreamWriter(new FileOutputStream(destinationFile), "Windows-1250");

            while (input.read() != -1) {
                output.write(input.read());
            }

        } catch (Exception e) {
            e.printStackTrace(); 
        } finally {
            input.close();
            output.close(); 
        }      
    }
}

【问题讨论】:

  • 请更清楚地解释发生了什么问题。输出是什么?你做了什么来尝试解决你的问题?
  • 不要 catch Exception... 这也会捕获所有未经检查的异常。抓住更具体的。

标签: java utf-8 codepages cp1250


【解决方案1】:

您需要一个 InputStreamReader,它知道来自 FileInputStream 的数据必须使用 UTF-8 字符集进行解释。

这是一个例子。为简洁起见,我省略了关闭资源。

    FileInputStream input = new FileInputStream(file);
    InputStreamReader reader = new InputStreamReader(input, "utf-8");
    FileOutputStream output = new FileOutputStream(destinationFile);
    OutputStreamWriter writer = new OutputStreamWriter(output, "Windows-1250");

    int read = reader.read();
    while (read != -1)
    {
        writer.write(read);
        read = reader.read();
    }

还有一件事:在你的 while 循环中,你有两次对 input.read 的调用,但你只调用了一次 output.write()。这意味着你只写了你读过的字节的一半。

【讨论】:

  • 如我所说,我省略了关闭资源,你仍然需要这样做。该文件可能为空,因为 FileOutputStream 尚未刷新。
  • 你关闭所有资源了吗?包括读者和作者?我刚刚对其进行了测试,当您仅关闭输出流而不关闭编写器时,destinationFile 实际上仍然为空。
【解决方案2】:

以下是使用 Java 7 时的操作方式:

final Path src = Paths.get("C:\\test\\utf-8.txt");
final Path dst = Paths.get("C:\\test\\Cp1250.txt");

try (
    BufferedReader reader = Files.newBufferedReader(src, StandardCharsets.UTF_8);
    BufferedWriter writer = Files.newBufferedWriter(dst, 
        Charset.forName("windows-1252"));
) {
    String line;
    while ((line = reader.readLine()) != null) {
        writer.write(line);
        writer.newLine();
    }
    writer.flush();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-02
    • 1970-01-01
    • 2018-02-06
    • 2012-11-08
    • 2014-07-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多