Java ile UTF-8 dosyası nasıl yazılır?


180

Bazı mevcut kod var ve sorun onun 1252 kod sayfası dosyası oluşturmak, bir UTF-8 dosyası oluşturmak için zorlamak istiyorum

Herkes şu anda çalışır diyorum gibi bu kod ile bana yardımcı olabilir ... ama ben utf tasarruf zorlamak gerekir .. ben bir parametre ya da bir şey geçebilir?

bu benim sahip olduğum şey, herhangi bir yardım gerçekten takdir

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
Lütfen mümkünse derleyiciyi geçen kodu gönderin.
JesperE

gergedan gibi görünüyor (javascript)
dfa

Yanıtlar:


208

Kullanmak yerine FileWriterbir FileOutputStream. Daha sonra OutputStreamWriterbunu yapıcıya bir kodlama geçirmenize izin veren bir an içine sarabilirsiniz . Daha sonra verilerinizi, kaynaklarla deneme ifadesinin içine yazabilirsiniz :

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

118
... ve Sun'a lanet olsun, Charset alan FileWriter'a bir kurucu koymadı.
Jon Skeet

3
Garip bir gözetim gibi görünüyor. Ve hala düzeltmediler.
skaffman

4
@Jon Skeet: FileWriter'ın FileOutputStream için varsayılan kodlama ve arabellek boyutunu kabul eden bir sarıcı olduğu göz önüne alındığında, bu noktayı yenmez mi?
Powerlord

Özür dilerim, OutputStreamWriter'ı kastediyorum, FileOutputStream için değil.
Powerlord

198

Bunu dene

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

1
Bence bir yazım hatası var. Writer out = ...olarak düzeltilmelidir BufferedWriter out = ... .
asmaier

20
Yazar Soyut Sınıf, BufferedWriter uyguluyor ve write () + close () bildirildi.
Markus Lausberg

3
Bu sadece UTF-8 değil, BOM'sız gerçek bir UTF-8 oluşturur. Bunu zorlamanın bir yolu var mı?
neverMind

25

FileUtils.writeApache Commons'tan kullanmayı deneyin .

Şöyle bir şey yapabilmelisiniz:

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

Bu, yoksa dosyayı oluşturur.


4
Bu da bir dosya UTF-8 BOM olmadan üretir ... İlgili olup olmadığını bilmiyorum.
neverMind

3
@Smarty yalnızca Apache Commons kullanıyorsanız. Aksi takdirde, sadece birkaç karakter daha yazmak istemediğiniz için başka bir kavanoz eklemek korkunç bir atık gibi görünüyor.
Jason

FileUtils sınıfında 'write (..)' yöntemi göremedim. Ben müşterek IO 1.4
RRM

Java belgelerini soruda gösterilen bağlantıda okursanız, size yazma API'lerinin tanıtıldığı Commons IO API'sının sürümünü söyler. Yazma API'leri v2.0'dan itibaren tanıtıldı.
A_M

Sadece FileUtils.write (...) yerine FileUtils.writeStringToFile (...) (commons-io-1.3.1.jar ile) yöntemini kullandığımı belirtmek isterim.
Léa Massiot

21

Java'nın UTF-8 yazımı hata aldığı için burada verilen tüm cevaplar işe yaramaz.

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



4
Yazarken tek sorun BOM eksik. Önemli değil. Öte yandan bir ürün ağacının bulunduğu bir dosyayı okumak için manuel olarak soyulması gerekir.
Axel Fontaine

2
UTF-8 ürün ağacına ihtiyaç duymaz, bu nedenle teknik olarak yazılmış dosya hala geçerli bir UTF-8 kodlu metin dosyasıdır. Hata BOM ile bir UTF-8 okuma ile.
Kien Truong

@Chris bugs.sun.com bağlantısı koptu. Çalışan bir tane var mı?
Matthias

Hala benim için çalışıyor; Giriş yapmadım falan değilim. Hata 4508058 için googling'i deneyin.
Chris

21

Java 7'den beri aynısını Files.newBufferedWriterbiraz daha özlü bir şekilde yapabilirsiniz:

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 Dosyalar yarar tipi dosyaları ile çalışmak için yararlıdır:

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 sürümü size çıkarmanıza olanak sağlar Karakter Kümesi UTF-8'e yöntemler varsayılan - argüman.


3

UTF-8 kodlu xml yazmak için PrintWriter kullanarak java ile UTF-8 kodlu dosyayı yazabiliriz

Veya buraya tıklayın

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

3

Aşağıdaki örnek kod dosyayı satır satır okuyabilir ve yeni dosyayı UTF-8 formatında yazabilir. Ayrıca, açıkça Cp1252 kodlama belirtiyorum.

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

    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.