그러냐

[PHP]CSV파일 다운로드, 한글 깨짐, UTF-8 BOM 본문

php

[PHP]CSV파일 다운로드, 한글 깨짐, UTF-8 BOM

관절분리 2019. 12. 30. 14:36
반응형

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 표

EncodingRepresentation

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

 

출처 : http://b1ix.net/201

반응형