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
'Project & Issu' 카테고리의 다른 글
오라클 PL SQL 마이그레이션 (0) | 2024.06.18 |
---|---|
feign client 버그 - java.lang.IllegalArgumentException: name is required (0) | 2024.02.29 |
feign client에서 @RequestParameter에 "&" 를 넘겨주지 못 하는 버그 (0) | 2023.12.14 |
좋아요 기능 동시성 처리 (0) | 2023.05.04 |
게시판 개인 프로젝트 JPA 이슈 해결 - N+1, LazyInitializationException (0) | 2023.05.02 |