Bagaimana cara menulis file UTF-8 dengan Java?


180

Saya memiliki beberapa kode saat ini dan masalahnya adalah membuat file codepage 1252, saya ingin memaksanya untuk membuat file UTF-8

Adakah yang bisa membantu saya dengan kode ini, seperti yang saya katakan saat ini berfungsi ... tetapi saya harus memaksa save on utf .. bisakah saya memberikan parameter atau sesuatu ??

inilah yang saya miliki, bantuan apa pun sangat dihargai

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
Silakan kirim kode yang melewati kompiler, jika memungkinkan.
JesperE

tampaknya menjadi badak (javascript)
dfa

Jawaban:


208

Alih-alih menggunakan FileWriter, buat a FileOutputStream. Anda kemudian dapat membungkus ini dalam OutputStreamWriter, yang memungkinkan Anda untuk melewatkan penyandian dalam konstruktor. Kemudian Anda dapat menulis data Anda di dalam pernyataan coba-dengan-sumber daya :

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

118
... dan mengutuk Sun tidak memasukkan konstruktor ke FileWriter yang mengambil Charset.
Jon Skeet

3
Tampaknya seperti pengawasan yang aneh. Dan mereka masih belum memperbaikinya.
skaffman

4
@ Jon Skeet: Mengingat bahwa FileWriter adalah pembungkus untuk FileOutputStream yang mengasumsikan penyandian default dan ukuran buffer, bukankah itu mengalahkan intinya?
Powerlord

Maaf, saya bermaksud untuk OutputStreamWriter, bukan untuk FileOutputStream.
Powerlord

198

Coba ini

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

1
Saya pikir ada kesalahan ketik. Writer out = ...harus diperbaiki BufferedWriter out = ... .
asmaier

20
Writer adalah Kelas Abstrak, BufferedWriter menerapkan dan menulis () + tutup () dideklarasikan.
Markus Lausberg

3
Ini menciptakan UTF-8 aktual tanpa BOM, bukan hanya UTF-8. Apakah ada cara untuk memaksanya?
NeverMind

25

Coba gunakan FileUtils.writedari Apache Commons.

Anda harus dapat melakukan sesuatu seperti:

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

Ini akan membuat file jika tidak ada.


4
Ini juga menghasilkan file UTF-8 tanpa BOM ... Saya tidak tahu apakah itu relevan atau tidak.
NeverMind

3
@ Smart hanya jika Anda sudah menggunakan Apache Commons. Kalau tidak, sepertinya sia-sia memasukkan toples lain hanya karena Anda tidak ingin menulis beberapa karakter lagi.
Jason

Saya tidak bisa melihat metode 'tulis (..)' di kelas FileUtils. Saya memeriksa di commons IO 1.4
RRM

Jika Anda membaca dokumen Java pada tautan yang diperlihatkan dalam pertanyaan, itu memberi tahu Anda versi Commons IO API di mana API penulisan diperkenalkan. Sepertinya menulis API diperkenalkan dari v2.0 dan seterusnya.
A_M

Saya ingin menyebutkan bahwa saya menggunakan metode FileUtils.writeStringToFile (...) (dengan commons-io-1.3.1.jar), bukan FileUtils.write (...).
Léa Massiot

21

Semua jawaban yang diberikan di sini tidak akan berfungsi karena tulisan UTF-8 java disadap.

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


Sejauh yang saya tahu, bug ini adalah yang ini (karena penulis artikel itu tidak repot menyebutkannya): bugs.sun.com/view_bug.do?bug_id=4508058
Chris

4
Satu-satunya masalah saat menulis adalah BOM yang hilang. Bukan masalah besar. Membaca file dengan BOM di sisi lain memerlukan pengupasan secara manual.
Axel Fontaine

2
UTF-8 tidak perlu BOM, jadi secara teknis file tertulis masih berupa file teks yang disandikan UTF-8. Bugnya adalah dengan membaca UTF-8 dengan BOM.
Kien Truong

@Chris tautan bugs.sun.com rusak. Apakah Anda punya satu yang berfungsi?
Matthias

Masih bekerja untuk saya; Saya tidak masuk atau apa pun. Coba googling untuk bug 4508058.
Chris

21

Karena Java 7 Anda dapat melakukan hal yang sama dengan Files.newBufferedWritersedikit lebih ringkas:

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

The Java 7 Files jenis utilitas berguna untuk bekerja dengan file:

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

Versi Java 8 memungkinkan Anda untuk menghilangkan argumen Charset - metode default untuk UTF-8.


3

kita dapat menulis file yang dikodekan UTF-8 dengan java menggunakan PrintWriter untuk menulis UTF-8 yang dikodekan xml

Atau Klik di sini

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

3

Kode contoh di bawah ini dapat membaca file baris demi baris dan menulis file baru dalam format UTF-8. Juga, saya secara eksplisit menentukan pengkodean 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();

    }
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.