2017-09-19 7 views
1

CSV 파일을 Excel에서 열면 분명히 Byte Order Mark가 있어야합니다. CSV 다운로드는 요청 중에 데이터가 생성되므로 컨트롤러의 HttpServletResponse의 출력 스트림에 기록하여 구현됩니다. BOM 바이트 - java.io.CharConversionException: Not an ISO 8859-1 character: [] (지정된 인코딩이 UTF-8 임에도 불구하고)을 쓸 때 예외가 발생합니다. BOM을 사용하여 UTF-8로 인코딩 된 CSV 파일을 반환하는 Java Spring


훨씬 이해가되지 않습니다

@RequestMapping("/monthly/list") 
public List<MonthlyDetailsItem> queryDetailsItems(
     MonthlyDetailsItemQuery query, 
     @RequestParam(value = "format", required = false) String format, 
     @RequestParam(value = "attachment", required = false, defaultValue="false") Boolean attachment, 
     HttpServletResponse response) throws Exception 
{ 
    // load item list 
    List<MonthlyDetailsItem> list = detailsSvc.queryMonthlyDetailsForList(query); 
    // adjust format 
    format = format != null ? format.toLowerCase() : "json"; 
    if (!Arrays.asList("json", "csv").contains(format)) format = "json"; 

    // modify common response headers 
    response.setCharacterEncoding("UTF-8"); 
    if (attachment) 
     response.setHeader("Content-Disposition", "attachment;filename=duomenys." + format); 

    // build csv 
    if ("csv".equals(format)) { 
     response.setContentType("text/csv; charset=UTF-8"); 
     response.getOutputStream().print("\ufeff"); 
     response.getOutputStream().write(buildMonthlyDetailsItemCsv(list).getBytes("UTF-8")); 
     return null; 
    } 

    return list; 
} 
+0

BOM 부분에'response.getOutputStream(). write ("\ ufeff".getBytes ("UTF-8"));를 사용해 주시겠습니까? – Berger

답변

0

문제의 컨트롤러에있어서, 상기 BOM은 UTF-16입니다; UTF-8에는 바이트 순서가 없습니다. setCharacterEncoding로 설정 한 인코딩은 getWriter에 사용되며 getOutputStream에는 사용되지 않습니다.

UPDATE :

확인이 시도 : 나는 문자열을 반환 buildMonthlyDetailsItemCsv 그 방법을 믿고있어

if ("csv".equals(format)) { 
    response.setContentType("text/csv; charset=UTF-8"); 
    PrintWriter out = response.getWriter(); 
    out.print("\uFEFF"); 
    out.print(buildMonthlyDetailsItemCsv(list)); 
    return null; 
} 

.

+0

사실이 아닙니다. https://en.wikipedia.org/wiki/Byte_order_mark를 참조하십시오. UTF-8에 대해 정의 된 BOM이 있지만 필수는 아닙니다. 아아, Java는 UTF-8 BOM을 자동으로 처리 할 수 ​​없습니다. – vanje

+0

@vanje UTF-8 인코딩에서는 쓸모가 없습니다. –

+0

예. 그러나 이것은 요점이 아닙니다. 때로는 그것을 처리해야합니다. 쓸데없는 말. – vanje