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

코뿔소 인 것 같습니다 (자바 스크립트)
dfa

답변:


208

을 사용하는 대신을 FileWriter만듭니다 FileOutputStream. 그런 다음 이것을로 감싸서 OutputStreamWriter생성자에서 인코딩을 전달할 수 있습니다. 그런 다음 try-with-resources 문 안에 데이터를 쓸 수 있습니다 .

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

117
... 그리고 Charset을 취하는 FileWriter에 생성자를 넣지 않는 Sun의 저주.
Jon Skeet

3
이상한 감독처럼 보입니다. 그리고 그들은 여전히 ​​그것을 고치지 않았습니다.
skaffman 2016 년

4
@ Jon Skeet : FileWriter가 기본 인코딩 및 버퍼 크기를 가정하는 FileOutputStream의 래퍼라고 가정하면 포인트를 잃지 않습니까?
Powerlord

죄송합니다. FileOutputStream이 아니라 OutputStreamWriter를 의미했습니다.
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 ()가 선언되었습니다.
Markus Lausberg

3
이것은 UTF-8뿐만 아니라 BOM이없는 실제 UTF-8을 생성합니다. 그것을 강제하는 방법이 있습니까?
neverMind

25

사용해보십시오 FileUtils.writeApache Commons에서 .

다음과 같은 작업을 수행 할 수 있어야합니다.

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

파일이 없으면 작성됩니다.


4
이것은 BOM없이 UTF-8 파일을 생성합니다 ... 관련 여부는 알 수 없습니다.
neverMind

3
이미 Apache Commons를 사용하고있는 경우에만 @Smarty. 그렇지 않으면 문자를 몇 개 더 쓰고 싶지 않기 때문에 또 다른 항아리를 포함시키는 것은 끔찍한 낭비 인 것 같습니다.
Jason

FileUtils 클래스에서 'write (..)'메소드를 볼 수 없습니다. 나는 공유지 IO 1.4 체크
RRM

질문에 표시된 링크에서 Java 문서를 읽으면 쓰기 API가 도입 된 Commons IO API 버전을 알려줍니다. v2.0부터 쓰기 API가 도입 된 것 같습니다.
A_M

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=4508058
Chris

4
쓸 때 유일한 문제는 누락 된 BOM입니다. 별거 아냐 반면에 BOM이있는 파일을 읽으려면 수동으로 제거해야합니다.
Axel Fontaine

2
UTF-8에는 BOM이 필요하지 않으므로 기술적으로 작성된 파일은 여전히 ​​유효한 UTF-8 인코딩 텍스트 파일입니다. 버그는 BOM으로 UTF-8을 읽는 것입니다.
Kien Truong

@Chris the bugs.sun.com 링크가 끊어졌습니다. 작동하는 것이 있습니까?
Matthias

여전히 나를 위해 일하고; 로그인하지 않았거나 아무것도 없습니다. 버그 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!");
    // ...
}

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

자바 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));
  }
}

자바 8 버전은 당신이 생략 할 수 있습니다 캐릭터 세트의 UTF-8 방법의 기본 - 인수를.


3

PrintWriter를 사용하여 UTF-8로 인코딩 된 XML을 작성하여 Java로 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();

    }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.