2009-06-16 37 views
154

Tôi có một số mã hiện tại và vấn đề là tạo ra một tệp mã 1252, tôi muốn buộc nó tạo tệp UTF-8Làm thế nào để ghi tệp UTF-8 bằng Java?

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 phải lực lượng tiết kiệm trên utf .. tôi có thể vượt qua một tham số hoặc một cái gì đó ??

đây là những gì tôi có, bất cứ sự 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 đăng mã qua trình biên dịch, nếu có thể. – JesperE

+0

nó có vẻ là tê giác (javascript) – dfa

Trả lời

167

Thay vì sử dụng FileWriter, tạo một FileOutputStream. Sau đó, bạn có thể bọc nó 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 bạn với:

OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(PROPERTIES_FILE), StandardCharsets.UTF_8) 
+106

... và nguyền rủa tại Sun không đặt trong một nhà xây dựng để FileWriter mà mất một Charset. –

+2

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

+3

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

181

Hãy thử điều này

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

Tôi nghĩ có lỗi đánh máy. 'Writer out = ...'nên được sửa thành ' BufferedWriter out = ... '. – asmaier

+18

Writer là lớp trừu tượng, BufferedWriter đang triển khai và viết() + close() được khai báo. –

+3

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

8
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(); 
18

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

Bạn sẽ có thể làm điều gì đó như:

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

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

+3

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

+3

@Smarty chỉ khi bạn đang sử dụng Apache Commons. Nếu không, có vẻ như một sự lãng phí khủng khiếp để bao gồm một cái lọ khác chỉ vì bạn không muốn viết thêm vài ký tự nữa. – Jason

+0

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

21

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

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

+0

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

+4

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

+2

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

3

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

Hoặc Bấm here

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

Các Java 7 Files utility type là hữu ích cho làm việc với các tệp:

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 cho phép bạn bỏ qua đối số Charset - các phương thức mặc định là UTF-8.

13

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

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

Điều này sẽ ở trên cùng! –

2

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

    } 
} 
Các vấn đề liên quan