본문 바로가기

IT . Web/소프트웨어 . 웹 서비스

ASP.NET, CSV 포맷 내보낼 때 엑셀에서 문자셋(Charset, Encoding) 인식실패문제 해결방법

ASP.NET을 비롯한 웹애플리케이션에서 사용자의 브라우저를 통해 파일로 데이터를 내보낼 때, 주로 xls 또는 csv의 포맷을 쓰게 됩니다. xls 보다는 csv를 좀 더 애용하려는 편인데, 이왕이면 사내에서 비용이 드는 MS 오피스보다는 오픈 오피스를 쓰려고 하기 때문입니다. 오픈 오피스에서 xls를 열 수는 있지만 스타일 등에서 호환이 안되는 부분도 많아서 좀 그렇지만, csv는 워낙 포맷이 단순해서 그런 걱정을 덜 수 있죠.

그런데 페이지와 데이터의 인코딩이 UTF-8이어도, 내보낼 때 엑셀로 열면 엑셀이 ASCII로 인식해서 한글 등의 경우 잘못된 문자열이 표현될 수 있습니다.

이럴 때 도움이 될 수 있는 방법이 유니코드 BOM(Byte Order Mark)를 CSV 파일의 맨 앞에 추가해주는 것입니다. 앞의 3바이트를 읽고 엑셀이 UTF-8 인코딩임을 판별할 수 있도록 돕는 거죠.

샘플 코드는 아래와 같습니다.

        StringBuilder sb = new StringBuilder(1024);

        Response.Clear();
        Response.AddHeader("Content-Disposition", "attachment;filename=Pocaccino_Cafe.csv");

        byte[] utf8Bom = { 0xEF, 0xBB, 0xBF };

        Response.BinaryWrite(utf8Bom);
        Response.Write(sb.ToString());
        Response.Charset = "UTF-8";
        Response.End();

참.. 영어권에 살았으면 덜 염려했을 것들을 고민하니 피곤한 감도 있지만.. 어딜가나 해결해야 할 사안들은 있고 잘 해결해야겠죠?(개인적으로 인코딩 문제로 뻘짓한 적 많음-_-;;)