Как написать файл 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-with-resources :

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

118
... и проклинаю 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 без спецификации, а не только UTF-8. Есть ли способ заставить это?
neverMind

25

Попробуйте использовать FileUtils.writeот Apache Commons.

Вы должны быть в состоянии сделать что-то вроде:

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

Это создаст файл, если он не существует.


4
Это также создает файл UTF-8 без спецификации ... Я не знаю, актуально это или нет.
neverMind

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

Я не смог увидеть метод write (..) в классе FileUtils. Я проверил в общих IO 1.4
RRM

Если вы прочтете документацию по Java по ссылке, показанной в вопросе, то она сообщит вам версию API ввода-вывода Commons, в которой были представлены API записи. Похоже, API записи были введены начиная с версии 2.0.
A_M

Сразу хочу отметить, что вместо FileUtils.write (...) я использовал метод FileUtils.writeStringToFile (...) (с commons-io-1.3.1.jar).
Леа Массиот

21

Все ответы, приведенные здесь, не будут работать, поскольку запись в Java в UTF-8 содержит ошибки.

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


Насколько я могу судить, это ошибка (поскольку автор этой статьи не упоминает об этом): bugs.sun.com/view_bug.do?bug_id=4508058
Крис

4
Единственная проблема при записи - недостающая спецификация. Ничего страшного. С другой стороны, для чтения файла с спецификацией необходимо удалить его вручную.
Аксель Фонтейн

2
UTF-8 не нуждается в спецификации, поэтому технически записанный файл все еще является действительным текстовым файлом в кодировке UTF-8. Ошибка в чтении UTF-8 с BOM.
Кьен Чыонг

@ Крис ссылка на bugs.sun.com не работает. У вас есть тот, который работает?
Матиас

Все еще работает для меня; Я не вошел в систему или что-нибудь. Попробуйте поискать ошибку на предмет ошибки 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 для записи XML в кодировке UTF-8

Или нажмите здесь

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.