จะเขียนไฟล์ UTF-8 ด้วย Java ได้อย่างไร


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

คำตอบ:


208

แทนการใช้สร้างFileWriter FileOutputStreamจากนั้นคุณสามารถล้อมสิ่งนี้ไว้ในที่OutputStreamWriterซึ่งช่วยให้คุณผ่านการเข้ารหัสในตัวสร้าง จากนั้นคุณสามารถเขียนข้อมูลของคุณไปยังที่อยู่ในคำชี้แจงลองกับทรัพยากร :

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

118
... และสาปแช่งที่ Sun ไม่ได้ใส่ตัวสร้างลงใน FileWriter ซึ่งใช้ Charset
Jon Skeet

3
มันดูเหมือนการกำกับดูแลที่แปลก และพวกเขายังไม่ได้แก้ไข
skaffman

4
@ จอน Skeet: เนื่องจาก FileWriter เป็น wrapper สำหรับ 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

20
Writer เป็นคลาสนามธรรมบัฟเฟอร์ BufferedWriter กำลังใช้งานและเขียน () + ปิด () จะถูกประกาศ
Markus Lausberg

3
สิ่งนี้สร้าง UTF-8 จริงโดยไม่มี BOM ไม่ใช่แค่ UTF-8 มีวิธีบังคับหรือไม่
neverMind

25

ลองใช้FileUtils.writeจาก Apache Commons

คุณควรทำสิ่งที่ชอบ:

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

สิ่งนี้จะสร้างไฟล์หากไม่มีอยู่


4
สิ่งนี้ยังสร้างไฟล์ UTF-8 โดยไม่ต้อง BOM ... ฉันไม่รู้ว่ามันเกี่ยวข้องหรือไม่
NeverMind

3
@Smarty เฉพาะเมื่อคุณใช้ Apache Commons อยู่แล้ว มิฉะนั้นดูเหมือนว่าจะเป็นเรื่องน่าขยะแขยงที่จะรวมไหอีกอันไว้เพียงเพราะคุณไม่ต้องการเขียนตัวละครอีกสองสามตัว
Jason

ฉันไม่เห็นวิธี 'เขียน (.. )' ในคลาส FileUtils ฉันตรวจสอบใน Commons IO 1.4
RRM

หากคุณอ่านเอกสาร Java ที่ลิงค์ที่แสดงในคำถามมันจะบอกคุณถึงเวอร์ชันของ Commons IO API ที่แนะนำให้เขียน API ดูเหมือนว่า API การเขียนได้รับการแนะนำจาก v2.0 เป็นต้นไป
A_M

แค่อยากจะพูดถึงว่าฉันใช้วิธีการ FileUtils.writeStringToFile (... ) (ด้วย Commons-io-1.3.1.jar) แทน FileUtils.write (... )
Léa Massiot

21

คำตอบทั้งหมดที่ให้ไว้ที่นี่จะไม่ทำงานเนื่องจากการเขียน UTF-8 ของ java ถูกบั๊ก

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 ที่ถูกต้อง ข้อผิดพลาดเกิดจากการอ่าน UTF-8 พร้อม BOM
Kien Truong

@Chris the bugs.sun.com ลิงก์เสีย คุณมีอันที่ใช้ได้หรือไม่?
Matthias

ยังใช้งานได้สำหรับฉัน ฉันไม่ได้เข้าสู่ระบบหรืออะไร ลองใช้ googling เพื่อหาข้อผิดพลาด 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!");
    // ...
}


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 ด้วย java โดยใช้ PrintWriter เพื่อเขียน UTF-8 ที่เข้ารหัส xml

หรือคลิกที่นี่

PrintWriter out1 = new PrintWriter(new File("C:\\abc.xml"), "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();

    }
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.