2015-04-28
1. csv형식으로 파일을 만들었다.
echo "1","2015-04-28","데이터 정상 입력";

2. 웹페이지에는 제대로 출력 된다.
"1","2015-04-28","데이터 정상 입력"

3. csv파일로 다운로드 할 수 있게 만든다.
header('Content-type: text/csv; charset=UTF-8');
header("Content-disposition: attachment; filename=test.csv");
echo "1","2015-04-28","데이터 정상 입력";

4. 다운로드 해보니 제대로 출력된다.
"1","2015-04-28","데이터 정상 입력"

5. 엑셀로 해당 csv 파일을 열어보니 한글이 깨진다!!
 1  2015-04-28  ?붾젅?ㅽ?-?ㅻ룞泥?

2,3,4번에서 글자가 깨지는 경우는 해당 페이지나, 출력 문자열의 캐릭터셋을 조정하면 쉽게 고칠 수 있다.
하지만 5번에서 글자가 깨지는 경우는 아무리 캐릭터셋을 맞춰도 해결 되지가 않는다.

이럴 경우에는 데이터 출력 전에 아래와 같이 UFT-8 BOM을 넣어주면 엑셀에서도 제대로 보일 것이다.
header('Content-type: text/csv; charset=UTF-8');
header("Content-disposition: attachment; filename=test.csv");
echo "\xEF\xBB\xBF"; 
echo "1","2015-04-28","데이터 정상 입력";


그럼 여기서 알아두어야 할 것이 있는데, BOM(Byte Order Mark)이란.. 유니코드에서 엔디안을 구별하기 위해 사용되는 문자라고 한다.

참고 : http://ko.wikipedia.org/wiki/바이트_순서_표식

뭐 쉽게 말해서, 문서 맨 앞에 눈에 보이지 않는 특정한 바이트를 넣어서 이것을 해석하게 함으로써 해당 문서가 제대로 된 캐릭터셋 값을 가지도록 하는 것이다.

BOM 표
Encoding Representation
UTF-8 EF BB BF
UTF-16 빅 엔디안 FE FF
UTF-16 리틀 엔디안 FF FE
UTF-32 빅 엔디안 00 00 FE FF
UTF-32 리틀 엔디안 FF FE 00 00
SCSU 0E FE FF
UTF-EBCDIC DD 73 66 73
BOCU-1 FB EE 28