【问题标题】:How to write a UTF-8 file with Java?如何用 Java 编写 UTF-8 文件?
【发布时间】:2023-04-11 03:09:02
【问题描述】:

我有一些当前代码,问题是它创建了一个 1252 代码页文件,我想强制它创建一个 UTF-8 文件

谁能帮我处理这段代码,正如我所说的,它目前可以工作......但我需要强制保存 utf.. 我可以传递一个参数或其他东西吗??

这就是我所拥有的,任何帮助都非常感谢

var out = new java.io.FileWriter( new java.io.File( path )),
        text = new java.lang.String( src || "" );
    out.write( text, 0, text.length() );
    out.flush();
    out.close();

【问题讨论】:

  • 如果可能,请发布通过编译器的代码。
  • 好像是犀牛(javascript)

标签: java file-io utf-8


【解决方案1】:

不要使用FileWriter,而是创建一个FileOutputStream。然后,您可以将其包装在 OutputStreamWriter 中,这允许您在构造函数中传递编码。然后你可以将你的数据写入try-with-resources Statement

try (OutputStreamWriter writer =
             new OutputStreamWriter(new FileOutputStream(PROPERTIES_FILE), StandardCharsets.UTF_8))
    // do stuff
}

【讨论】:

  • ... 并诅咒 Sun 没有将构造函数放入 FileWriter 中,该构造函数采用 Charset。
  • 这似乎是一个奇怪的疏忽。他们仍然没有修复它。
  • @Jon Skeet:鉴于 FileWriter 是 FileOutputStream 的包装器,它假定默认的编码和缓冲区大小,这不是重点吗?
  • 对不起,我的意思是 OutputStreamWriter,而不是 FileOutputStream。
  • 我建议将实现 Closeable 接口的类型的每个声明分开,特别是如果您对资源使用 try,例如“new FileOutputStream”;是一种很好的做法,可以避免将来出现“IOException: Too many open files”之类的错误。
【解决方案2】:

试试这个

Writer out = new BufferedWriter(new OutputStreamWriter(
    new FileOutputStream("outfilename"), "UTF-8"));
try {
    out.write(aString);
} finally {
    out.close();
}

【讨论】:

  • 我认为有一个错字。 Writer out = ... 应更正为 BufferedWriter out = ...
  • Writer 是抽象类,BufferedWriter 正在实现,并声明了 write() + close()。
  • 这将创建一个没有 BOM 的实际 UTF-8,而不仅仅是 UTF-8。有没有办法强制这样做?
【解决方案3】:
var out = new java.io.PrintWriter(new java.io.File(path), "UTF-8");
text = new java.lang.String( src || "" );
out.print(text);
out.flush();
out.close();

【讨论】:

    【解决方案4】:

    尝试使用来自 Apache Commons 的 FileUtils.write

    您应该能够执行以下操作:

    File f = new File("output.txt"); 
    FileUtils.writeStringToFile(f, document.outerHtml(), "UTF-8");
    

    如果文件不存在,这将创建文件。

    【讨论】:

    • 这也会产生一个没有BOM的UTF-8文件......我不知道它是否相关。
    • @Smarty 仅当您已经在使用 Apache Commons 时。否则,仅仅因为你不想再写几个字符就包含另一个 jar 似乎是一种可怕的浪费。
    • 我在 FileUtils 类中看不到 'write(..)' 方法。我签入了 commons IO 1.4
    • 如果您阅读问题中显示的链接上的 Java 文档,那么它会告诉您引入写入 API 的 Commons IO API 版本。看起来写 API 是从 v2.0 开始引入的。
    • 只想提一下,我使用了 FileUtils.writeStringToFile(...) 方法(使用 commons-io-1.3.1.jar)而不是 FileUtils.write(...)。
    【解决方案5】:

    这里给出的所有答案都不起作用,因为 java 的 UTF-8 写入存在错误。

    http://tripoverit.blogspot.com/2007/04/javas-utf-8-and-unicode-writing-is.html

    【讨论】:

    • 据我所知,这个bug就是这个(因为那篇文章的作者懒得提了):bugs.sun.com/view_bug.do?bug_id=4508058
    • 写入时唯一的问题是缺少 BOM。没什么大不了。另一方面,读取带有 BOM 的文件需要手动剥离它。
    • UTF-8 不需要 BOM,因此从技术上讲,写入的文件仍然是有效的 UTF-8 编码文本文件。错误在于使用 BOM 读取 UTF-8。
    • @Chris bugs.sun.com 链接已损坏。你有一个有用的吗?
    • 对我仍然有效;我没有登录或任何东西。尝试在谷歌上搜索错误 4508058。
    【解决方案6】:

    我们可以使用 java 编写 UTF-8 编码的文件 使用 PrintWriter 编写 UTF-8 编码的 xml

    或点击here

    PrintWriter out1 = new PrintWriter(new File("C:\\abc.xml"), "UTF-8");
    

    【讨论】:

      【解决方案7】:

      Java 7 Files utility type 对于处理文件很有用:

      import java.nio.charset.StandardCharsets;
      import java.nio.file.Files;
      import java.nio.file.Path;
      import java.nio.file.Paths;
      import java.io.IOException;
      import java.util.*;
      
      public class WriteReadUtf8 {
        public static void main(String[] args) throws IOException {
          List<String> lines = Arrays.asList("These", "are", "lines");
      
          Path textFile = Paths.get("foo.txt");
          Files.write(textFile, lines, StandardCharsets.UTF_8);
      
          List<String> read = Files.readAllLines(textFile, StandardCharsets.UTF_8);
      
          System.out.println(lines.equals(read));
        }
      }
      

      Java 8 version 允许您省略 Charset 参数 - 方法默认为 UTF-8。

      【讨论】:

        【解决方案8】:

        从 Java 7 开始,您可以更简洁地使用 Files.newBufferedWriter 做同样的事情:

        Path logFile = Paths.get("/tmp/example.txt");
        try (BufferedWriter writer = Files.newBufferedWriter(logFile, StandardCharsets.UTF_8)) {
            writer.write("Hello World!");
            // ...
        }
        

        【讨论】:

          【解决方案9】:

          以下示例代码可以逐行读取文件并以 UTF-8 格式写入新文件。另外,我明确指定了 Cp1252 编码。

              public static void main(String args[]) throws IOException {
          
              BufferedReader br = new BufferedReader(new InputStreamReader(
                      new FileInputStream("c:\\filenonUTF.txt"),
                      "Cp1252"));
              String line;
          
              Writer out = new BufferedWriter(
                      new OutputStreamWriter(new FileOutputStream(
                              "c:\\fileUTF.txt"), "UTF-8"));
          
              try {
          
                  while ((line = br.readLine()) != null) {
          
                      out.write(line);
                      out.write("\n");
          
                  }
          
              } finally {
          
                  br.close();
                  out.close();
          
              }
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-10-31
            • 2012-04-20
            相关资源
            最近更新 更多