Làm cách nào để viết tệp UTF-8 bằng Java?


180

Tôi có một số mã hiện tại và vấn đề là nó tạo ra một tệp mã 1252, tôi muốn buộc nó tạo một tệp UTF-8

Bất cứ ai có thể giúp tôi với mã này, như tôi nói nó hiện đang hoạt động ... nhưng tôi cần buộc lưu vào utf .. tôi có thể truyền tham số hay gì không ??

đây là những gì tôi có, bất kỳ trợ giúp thực sự đánh giá cao

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
Vui lòng gửi mã vượt qua trình biên dịch, nếu có thể.
JesperE

nó dường như là tê giác (javascript)
dfa

Câu trả lời:


208

Thay vì sử dụng FileWriter, tạo một FileOutputStream. Sau đó, bạn có thể gói cái này trong một OutputStreamWriter, cho phép bạn chuyển mã hóa trong hàm tạo. Sau đó, bạn có thể ghi dữ liệu của mình vào đó trong Tuyên bố thử tài nguyên :

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

118
... và nguyền rủa tại Sun không đưa vào một hàm tạo cho FileWriter, trong đó có một Bộ ký tự.
Jon Skeet

3
Nó có vẻ như một giám sát kỳ lạ. Và họ vẫn chưa sửa nó.
skaffman

4
@Jon Skeet: Cho rằng FileWriter là một trình bao bọc cho FileOutputStream giả định kích thước bộ đệm và mã hóa mặc định, điều đó có làm mất điểm không?
Powerlord

Xin lỗi, ý tôi là cho OutputStreamWriter, không phải cho FileOutputStream.
Powerlord

198

Thử cái này

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

1
Tôi nghĩ rằng có một lỗi đánh máy. Writer out = ...nên được sửa thành BufferedWriter out = ... .
asmaier

20
Nhà văn là Lớp trừu tượng, BufferedWriter đang triển khai và write () + close () được khai báo.
Markus Lausberg

3
Điều này tạo ra một UTF-8 thực tế mà không có BOM, không chỉ UTF-8. Có cách nào để ép buộc điều đó?
neverMind

25

Hãy thử sử dụng FileUtils.writetừ Apache Commons.

Bạn sẽ có thể làm một cái gì đó như:

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

Điều này sẽ tạo tập tin nếu nó không tồn tại.


4
Điều này cũng tạo ra một tệp UTF-8 WIthout BOM ... Tôi không biết nó có liên quan hay không.
neverMind

3
@Smarty chỉ khi bạn đang sử dụng Apache Commons. Mặt khác, có vẻ như thật lãng phí khi bao gồm một bình khác chỉ vì bạn không muốn viết thêm một vài ký tự.
Jason

Tôi không thể thấy phương thức 'write (..)' trong lớp FileUtils. Tôi đã kiểm tra trong commons IO 1.4
RRM

Nếu bạn đọc các tài liệu Java trên liên kết được hiển thị trong câu hỏi, thì nó sẽ cho bạn biết phiên bản API IO của Commons nơi các API ghi được giới thiệu. Có vẻ như các API ghi được giới thiệu từ v2.0 trở đi.
A_M

Chỉ muốn đề cập rằng tôi đã sử dụng phương thức FileUtils.writeStringToFile (...) (với commons-io-1.3.1.jar) thay vì FileUtils.write (...).
Léa Massiot

21

Tất cả các câu trả lời được đưa ra ở đây sẽ không hoạt động vì cách viết UTF-8 của java bị lỗi.

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


Theo như tôi có thể nói, lỗi này là lỗi này (vì tác giả của bài báo đó không bận tâm đến nó): bug.sun.com/view_orms.do?orms_id=4508058
Chris

4
Vấn đề duy nhất khi viết là BOM bị thiếu. Không sao đâu. Đọc một tập tin với BOM mặt khác đòi hỏi phải tước nó bằng tay.
Axel Fontaine

2
UTF-8 không cần BOM, vì vậy về mặt kỹ thuật, tệp viết vẫn là tệp văn bản được mã hóa UTF-8 hợp lệ. Lỗi là khi đọc UTF-8 với BOM.
Kiên Trường

@Chris liên kết bug.sun.com bị hỏng. Bạn có cái nào hoạt động không?
Matthias

Vẫn làm việc cho tôi; Tôi không đăng nhập hoặc bất cứ điều gì. Hãy thử googling cho lỗi 4508058.
Chris

21

Vì Java 7, bạn có thể làm tương tự với Files.newBufferedWritermột chút ngắn gọn hơn:

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

Các Java 7 tập tin loại tiện ích rất hữu ích để làm việc với các tập tin:

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));
  }
}

Các phiên bản Java 8 cho phép bạn bỏ qua các Charset luận - phương pháp mặc định là UTF-8.


3

chúng ta có thể viết tệp được mã hóa UTF-8 bằng java bằng cách sử dụng PrintWriter để viết xml được mã hóa UTF-8

Hoặc bấm vào đây

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

3

Dưới đây mã mẫu có thể đọc từng dòng tệp và viết tệp mới ở định dạng UTF-8. Ngoài ra, tôi rõ ràng chỉ định mã hóa 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();

    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.