Як написати файл 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
}

117
... і проклинати в Sun, не вкладаючи конструктор до FileWriter, який приймає Charset.
Джон Скіт

3
Це здається дивним недоглядом. І вони все ще не виправили це.
скафман

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

20
Writer - клас абстрактних, BufferedWriter реалізує і декларується write () + close ().
Маркус Лоусберг

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 WIthout BOM ... Я не знаю, чи це актуально чи ні.
neverMind

3
@Smarty, лише якщо ви вже використовуєте Apache Commons. Інакше здається жахливим марно включати ще одну банку лише тому, що ви не хочете написати ще кілька символів.
Джейсон

Я не міг побачити метод 'write (..)' у класі FileUtils. Я перевірив у Відомості IO 1.4
RRM

Якщо ви читаєте документи Java на посиланні, наведеному у запитанні, то воно повідомляє вам версію API Commons IO, куди були введені 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
Кріс

4
Єдине питання при написанні - це відсутність BOM. Нічого страшного. Читання файлу з BOM, з іншого боку, вимагає зняти його вручну.
Аксель Фонтен

2
UTF-8 не потребує BOM, тому технічно записаний файл все ще є дійсним текстовим файлом, закодованим UTF-8. Помилка з читанням UTF-8 з BOM.
Кіен Труонг

@Chris посилання bugs.sun.com порушено. У вас є такий, який працює?
Маттіас

Досі працює для мене; Я не ввійшов у систему чи нічого. Спробуйте googling для помилки 4508058.
Кріс

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 дозволяє опустити аргумент Charset - методи за замовчуванням до 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();

    }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.