【问题标题】:java: how to convert a file to utf8java:如何将文件转换为utf8
【发布时间】:2010-06-10 21:25:28
【问题描述】:

我有一个文件包含一些非 utf8 字符(如“ISO-8859-1”),所以我想将该文件(或读取)转换为 UTF8 编码,我该怎么做?

代码是这样的:

File file = new File("some_file_with_non_utf8_characters.txt");

/* some code to convert the file to an utf8 file */

...

编辑:放一个编码示例

【问题讨论】:

  • 非UTF8?想缩小一点吗?一旦你知道输入编码就很容易,如果你不知道,基本上是不可能的。
  • 一些注意事项,文件很大(比如 1GB),所以我不能把它们放在 String 对象中...
  • 您的文件编码是什么?如果您使用的是 Linux 或 OS X(以及其他 Unx),您只需键入:*file some_file,它就会告诉您编码。顺便说一句,如果你在 Unx(至少 Linux 和 OS X)上,你应该有 *iconv 命令行。 “man iconv” 说:“将给定文件的编码从一种编码转换为另一种编码”,这可以说在 1GB 文件上比自写 Java 做得更好实用程序。请注意,UTF-8 编码可以表示每一个 Unicode 代码点,因此说文件 “有一些非 utf8 字符” 听起来很可疑......
  • @NoozNooz42:应用程序将在win32和unix/linux下运行

标签: java utf-8


【解决方案1】:

以下代码将文件从 srcEncoding 转换为 tgtEncoding:

public static void transform(File source, String srcEncoding, File target, String tgtEncoding) throws IOException {
    BufferedReader br = null;
    BufferedWriter bw = null;
    try{
        br = new BufferedReader(new InputStreamReader(new FileInputStream(source),srcEncoding));
        bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(target), tgtEncoding));
        char[] buffer = new char[16384];
        int read;
        while ((read = br.read(buffer)) != -1)
            bw.write(buffer, 0, read);
    } finally {
        try {
            if (br != null)
                br.close();
        } finally {
            if (bw != null)
                bw.close();
        }
    }
}

--编辑--

使用 Try-with-resources (Java 7):

public static void transform(File source, String srcEncoding, File target, String tgtEncoding) throws IOException {
    try (
      BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(source), srcEncoding));
      BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(target), tgtEncoding)); ) {
          char[] buffer = new char[16384];
          int read;
          while ((read = br.read(buffer)) != -1)
              bw.write(buffer, 0, read);
    } 
}

【讨论】:

  • 忽略我的评论,你是对的。顺便说一句,以前还没有见过这种最终关闭的方式。聪明。
【解决方案2】:
  String charset = "ISO-8859-1"; // or what corresponds
  BufferedReader in = new BufferedReader( 
      new InputStreamReader (new FileInputStream(file), charset));
  String line;
  while( (line = in.readLine()) != null) { 
    ....
  }

你已经解码了文本。您可以通过 simmetric Writer/OutputStream 方法使用您喜欢的编码(例如 UTF-8)来编写它。

【讨论】:

  • 逐行阅读的潜在问题是您可以更改行尾/分隔符。例如,如果最后一行没有行尾,您将添加一个。
  • 完全正确。这也是事实,通常这种效果实际上是可取的(更多的是“抛光”而不是“改变”)。但是,是的,人们必须意识到这一点。
  • 嗨,如果我不知道源/输入编码格式怎么办?能否请您说明一下。
【解决方案3】:

您需要知道输入文件的编码。例如,如果文件是 Latin-1,你会做这样的事情,

        FileInputStream fis = new FileInputStream("test.in");
        InputStreamReader isr = new InputStreamReader(fis, "ISO-8859-1");
        Reader in = new BufferedReader(isr);
        FileOutputStream fos = new FileOutputStream("test.out");
        OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");
        Writer out = new BufferedWriter(osw);

        int ch;
        while ((ch = in.read()) > -1) {
            out.write(ch);
        }

        out.close();
        in.close();

【讨论】:

  • 总结:读取文件自己的编码,然后写入新的编码。
【解决方案4】:

您只想将其读取为 UTF-8? 我最近在遇到类似问题时所做的是使用 -Dfile.encoding=UTF-8 启动 JVM,并正常读取/打印。我不知道这是否适用于你的情况。

使用该选项:

System.out.println("á é í ó ú")

正确打印字符。否则它会打印一个 ?符号

【讨论】:

  • @McD:我打算发表同样的评论。这是对-Dfile.encoding 使用的误解。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 2016-02-20
  • 2015-05-27
  • 2017-02-24
  • 2012-03-07
  • 1970-01-01
  • 2021-11-14
相关资源
最近更新 更多