2017-09-19 12 views
1

CSVファイルをExcelで開くとExcelの開始時にByte Order Markが表示されるはずです。 CSVのダウンロードは、要求時にデータが生成されるため、コントローラのHttpServletResponseの出力ストリームに書き込むことによって実装されます。 BOMバイト(が指定されていても、java.io.CharConversionException: Not an ISO 8859-1 character: [])を書き込もうとすると例外が発生します。 Java SpringがBOMを使用してUTF-8でエンコードされたCSVファイルを返す


それはあまり意味がありません

@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; 
} 

OK、これを試してみてください。

+0

これは当てはまりません。 https://en.wikipedia.org/wiki/Byte_order_markを参照してください。 UTF-8用にBOMが定義されていますが、必須ではありません。悲しいかな、JavaはUTF-8 BOMを自動的に処理することはできません。 – vanje

+0

@vanje UTF-8エンコーディングでは無用です。 –

+0

はい。しかし、これはポイントではありません。時々あなたはそれに対処しなければならない。役に立たない。 – vanje

関連する問題