Project & Issu

csv 파일 인코딩 문제

gu9gu 2024. 1. 5. 13:31

1.한글 문제

[문제]

UTF-8로 인코딩해서 CVC 파일 출력 시 한글이 깨지는 문제

 

[해결]

Microsoft Office EXCEL.exe 프로그램으로 csv 파일을 실행했을 때 'ANSI'라는 인코딩 방식으로 자동 인식한다.
'UTF-8'로 인코딩 된 파일을 'ANSI'로 읽으면 한글이 깨진다.
따라서 MS949로 인코딩 해서 출력한다.

private void download(String pathFileNamee, resultList) {

    try (CSVPrinter csvPrinter = new CSVPrinter(
            new BufferedWriter(
                    new OutputStreamWriter(
                            new FileOutputStream(pathFileName, true), "MS949"/*StandardCharsets.UTF_8*/
                    )
            ), CSVFormat.EXCEL)
    ) {
        try {
            scvPrinter.printRecord(resultList);
        } finally {
            csvPrinter.flush();
        }
    } catch(Exception e) {
        log.error("error message{} : ", e);
    }
}

 

 

2. 한글과 이모지 문제

[문제]

ms949로 인코딩 했을 때 😀😁😂 같은 이모지가  ? 물음표로 출력됨

 

[해결]

utf-8 BOM 방식으로 인코딩

파일 맨 앞에 '\ufeff'을 출력하면 프로그램이 파일을 UTF-8로 인식함. 

    public void printHeader(List<String> 헤더리스트, String 풀패스) {
		try (BufferedWriter bufferedWriter = new BufferedWriter(
                new OutputStreamWriter(
                        new FileOutputStream(풀패스, true), StandardCharsets.UTF_8))) {

             /* UTF-8 BOM 방식
              - 파일 맨 첫 부분에 write
              - 엑셀 프로그램이 파일 열 때, UTF-8 인코딩 된 것이라고 인식시킴
              - 한글, 이모지 정상 출력 */
 		bufferedWriter.write('\ufeff');
            
            try (CSVPrinter csvPrinter = new CSVPrinter(
                    bufferedWriter, CSVFormat.EXCEL.withHeader(헤더리스트.toArray(new String[0]))
            )) {
                csvPrinter.flush();
            }
        }
   }

 

 

 

1) ) 엑셀 프로그램이 CSV 파일을 열면 기본적으로 ANSI로 인식함. UTF-8을 ANSI로 인식하면 한글이 깨지므로 MSM949로 인코딩 했음.

2) MS949로 인코딩한 CSV파일을 열면 이모지는 ?로 보임

3) UTF-8 BOM 방식으로 인코딩하기 위해 '\ufeff'를 맨 앞에 출력

4)CSV 파일이 UTF-8로 인코딩 된 파일임을 엑셀 프로그램이 인식하여 UTF-8 인코딩된 문자들을 잘 표시한다.

5) 여기서 생각해야 할 부분은 UTF-8 BOM 방식으로 인코딩한 파일도 다른 어플리케이션에서는 깨질 수 있다는 것이다.

ex) UNIX, OUTLOOK

문자 인코딩 정보 - PowerShell | Microsoft Learn

아웃룩2016 English ver. 주소록 import/export 시 한글 깨짐 - Microsoft 커뮤니티

따라서 export 기능 제공시 utf-8, utf-8 bom 방식 다운로드를 사용자가 선택해서 다운로드 할 수 있게 하면 사용성 측면에서 좋다고 본다.

 

 

[뻘짓]

헤더 출력 후 내용을 출력하는 코드인데, 내용 출력이 첫 부분인 줄 알고 시도했다가 실패..

   > 헤더 출력 전에 즉, 파일 첫 시작 부분에 '\ufeff'를 출력해야한다.

 

 

 

 

 

 

 

[기타 참고 내용]

[Java] Try with resources 로 자원 반납하기 출처: https://hianna.tistory.com/546 

 

 

 

[참고]

엑셀 프로그램 CSV 파일 인코딩 인식 : https://pamyferret.tistory.com/20

https://stackoverflow.com/questions/4389005/how-to-add-a-utf-8-bom-in-java/77823401#77823401