JavaでUTF-8ファイルを書く方法は?


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 2009年

サイのようです(javascript)
dfa

回答:


208

を使用FileWriterする代わりに、を作成しFileOutputStreamます。次に、これをでラップすることがOutputStreamWriterできます。これにより、コンストラクターでエンコードを渡すことができます。次に、try-with-resourcesステートメント内にデータを書き込むことができます。

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

118
...そして、CharsetをとるFileWriterにコンストラクターを入れないで、Sunをののしりました。
Jon Skeet、

3
それは奇妙な見落としのようです。そして、彼らはまだそれを修正していません。
スカフマン、2009年

4
@Jon Skeet:FileWriterがデフォルトのエンコーディングとバッファサイズを想定するFileOutputStreamのラッパーであることを考えると、それはポイントを無効にしないでしょうか?
パワーロード2009年

申し訳ありませんが、FileOutputStreamではなく、OutputStreamWriterを対象としています。
パワーロード2009年

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 2010

20
Writerは抽象クラスであり、BufferedWriterが実装されており、write()+ close()が宣言されています。
Markus Lausberg、2010

3
これにより、UTF-8だけでなく、BOMのない実際のUTF-8が作成されます。それを強制する方法はありますか?
neverMind 2013年

25

FileUtils.writeApache Commonsから使用してみてください。

あなたは次のようなことができるはずです:

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

ファイルが存在しない場合は、ファイルが作成されます。


4
これは、BOMなしでファイルUTF-8も生成します...関連しているかどうかはわかりません。
neverMind 2013年

3
@Smartyは、すでにApache Commonsを使用している場合のみ。それ以外の場合は、さらにいくつかの文字を書きたくないという理由だけで、さらに別のjarを含めるのは非常に無駄です。
Jason

FileUtilsクラスに「write(..)」メソッドがありませんでした。Commons IO 1.4をチェックインしました
RRM 2014年

質問に示されているリンクでJavaドキュメントを読むと、書き込みAPIが導入されたCommons IO APIのバージョンがわかります。書き込みAPIはv2.0以降で導入されたようです。
A_M 2014年

FileUtils.write(...)ではなく、FileUtils.writeStringToFile(...)(commons-io-1.3.1.jarを使用)のメソッドを使用したことをお伝えしておきます。
LéaのMassiot

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
Chris

4
書き込み時の唯一の問題は、不足しているBOMです。大きな問題ではない。一方、BOMでファイルを読み取るには、手動で削除する必要があります。
Axel Fontaine

2
UTF-8はBOMを必要としないので、技術的には書き込まれたファイルはまだ有効なUTF-8エンコードされたテキストファイルです。バグは、BOMでUTF-8を読み取ることにあります。
Kien Truong 2014

@Chris bugs.sun.comリンクが壊れています。機能するものはありますか?
Matthias

まだうまくいきます。ログインしていません。バグ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バージョンでは、あなたは省略することができます文字セット UTF-8にメソッドのデフォルト-引数。


3

PrintWriterを使用してUTF-8エンコードファイルをJavaで書き込むことができます。

またはこちらをクリック

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

3

以下のサンプルコードは、ファイルを1行ずつ読み取り、新しいファイルを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.