如何用Java编写UTF-8文件?


180

我有一些当前代码,问题是它创建了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();

2
如果可能,请发布通过编译器的代码。
JesperE

它似乎是犀牛(javascript)
dfa

Answers:


208

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

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

117
...并且对Sun提出了诅咒,没有将构造函数放入采用字符集的FileWriter中。
乔恩·斯基特

3
这似乎是一个奇怪的疏忽。而且他们仍然没有解决它。
skaffman

4
@Jon Skeet:假设FileWriter是FileOutputStream的包装器(假定默认编码和缓冲区大小),那是否就不足为奇了?
Powerlord

抱歉,我的意思是OutputStreamWriter,而不是FileOutputStream。
Powerlord

198

试试这个

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

1
我认为有一个错字。Writer out = ...应该更正为BufferedWriter out = ...
asmaier 2010年

20
Writer是抽象类,BufferedWriter正在实现,并且声明了write()+ close()。
Markus Lausberg 2010年

3
这将创建不带BOM的实际UTF-8,而不仅仅是UTF-8。有办法强制吗?
neverMind 2013年

25

尝试FileUtils.write从Apache Commons使用。

您应该可以执行以下操作:

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

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


4
这还会产生一个没有BOM表的UTF-8文件...我不知道它是否相关。
neverMind 2013年

3
仅当您已经在使用Apache Commons时才使用@Smarty。否则,仅仅因为您不想再写几个字符而包含另一个jar似乎是很浪费的。
杰森

我在FileUtils类中看不到'write(..)'方法。我在14
RRM

如果您阅读问题中所示链接上的Java文档,那么它将告诉您引入了写API的Commons IO API的版本。看起来写API是从v2.0开始引入的。
A_M 2014年

只是要提到我使用了FileUtils.writeStringToFile(...)方法(与commons-io-1.3.1.jar一起使用),而不是FileUtils.write(...)。
LEA Massiot

21

由于Java的UTF-8编写有问题,因此此处给出的所有答案均无效。

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


据我所知,这个错误就是这个错误(因为该文章的作者没有费心提起它):bugs.sun.com/view_bug.do?bug_id=4508058
克里斯(Chris

4
写入时唯一的问题是缺少BOM。没什么大不了的。另一方面,使用BOM读取文件需要手动剥离。
Axel Fontaine

2
UTF-8不需要BOM,因此从技术上讲,写入的文件仍然是有效的UTF-8编码的文本文件。错误在于读取带有BOM的UTF-8。
坚恩

@Chris bugs.sun.com链接已损坏。你有一个可行的吗?
Matthias 2014年

仍然为我工作;我没有登录或任何东西。尝试谷歌搜索错误4508058。–
克里斯(Chris)

21

从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
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();

6

Java 7的文件实用型处理文件非常有用:

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,您可以省略字符集参数-方法的默认为UTF-8。



3

下面的示例代码可以逐行读取文件并以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();

    }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.