유닉스 (ubuntu) 플랫폼에서 csv 파일을 내보내는 디코딩 문제 해결

프로젝트에서 csv가 내보내는 기능을 사용했습니다. (프로젝트는 페이지에서ide 환경과 데이터베이스 환경까지 모두utf-8의 인코딩 집합을 사용합니다.) 그러나 로컬(win7) 환경에서 개발할 때 문자 인코딩이 설정되었든 excel로 열어도 인코딩이 없습니다.그러나 ubuntu에 배치한 결과 내보낸 csv 파일은ultra-edit로 열면 문제가 없지만 excel로 열면 코드가 엉망이 됩니다.해결 방법은 다음과 같습니다.
1. 내보낸 csv 파일에 BOM 추가하기
CsvWriter writer = new CsvWriter(outputwriter, ',');
writer.write(new String(new byte[] { (byte) 0xEF, (byte) 0xBB,(byte) 0xBF }));

2. 파일의 출력 흐름도 문자 집합을 붙여야 한다
resOs = response.getOutputStream();
OutputStream buffOs = new BufferedOutputStream(resOs);
OutputStreamWriter outputwriter = new OutputStreamWriter(buffOs, "gbk");

이렇게 하면 부호 문제를 해결할 수 있다.
전체 코드는 다음과 같습니다.
private void writeCsv(HttpServletResponse response, List<Record> recordList) {
		
		response.setContentType("data:text/csv;charset=gbk");
		response.setHeader("Content-Disposition", "attachment; filename=test.csv");
		OutputStream resOs = null;
		
		try {
			resOs = response.getOutputStream();
			OutputStream buffOs = new BufferedOutputStream(resOs);
			OutputStreamWriter outputwriter = new OutputStreamWriter(buffOs, "gbk");

			CsvWriter writer = new CsvWriter(outputwriter, ',');
			writer.write(new String(new byte[] { (byte) 0xEF, (byte) 0xBB,(byte) 0xBF }));
                        // write data
			//
			writer.flush();
			writer.close();
		} catch (IOException e) {
			log.error(e.getMessage(), e);
		} finally {
			try {
				if (resOs != null) {
					resOs.flush();
					resOs.close();
				}
			} catch (IOException e) {
				log.error(e.getMessage(), e);
			}
		}
	}

좋은 웹페이지 즐겨찾기