엑셀에서 CSV 텍스트 파일 UTF-8 한글 보이도록 저장하는 방법
결론 부터 말하면 utf-8이 아니라 utf-8 bom을 사용하면 됩니다.
방법은 아래와 같이 무척 간단하게 맢에 붙여 주기만 하면 엑셀에서 csv파일 열였을때 cp949가 아니라 utf-8일때도 한글 잘 보입니다.
utf-8과 utf-8 bom은 호환되기 때문에 파일의 헤더부분에 utf-8 bom 이라고 표시만 해주면 되는 방식 입니다.
// UTF-8 BOM 추가 (엑셀에서 한글 인식용)
$utf8_bom = "\xEF\xBB\xBF";
$wrtSize = file_put_contents($wrtFile, $utf8_bom . $csvDataH);
utf-8만 지원하는 에디터에서도 잘 보이고 엑셀 프로그램에서 csv파일 읽었을때 잘 보이는 방식 입니다.
/**
* UTF-8 BOM을 추가하여 CSV 파일을 생성하는 함수 (엑셀 한글 인식용)
*
* @param string $filePath 저장할 파일 경로
* @param string $csvData CSV 데이터 내용
* @return int|false 쓰여진 바이트 수 또는 실패시 false
*/
function writeCSVWithBOM( string $filePath, string $csvData) : int|false
{
$utf8_bom = "\xEF\xBB\xBF";
return file_put_contents($filePath, $utf8_bom . $csvData);
}
/**
* 배열 데이터를 UTF-8 BOM이 포함된 CSV 파일로 저장하는 함수
*
* @param string $filePath 저장할 파일 경로
* @param array $a CSV로 변환할 2차원 배열
* @param string $delimiter 구분자 (기본값: 쉼표)
* @param string $enclosure 감싸는 문자 (기본값: 큰따옴표)
* @return int|false 쓰여진 바이트 수 또는 실패시 false
*/
function arrayToCSVWithBOM( string $filePath, array $a, string $delimiter = ',', string $enclosure = '"') : int|false
{
$utf8_bom = "\xEF\xBB\xBF";
$output = fopen('php://temp', 'r+');
foreach ($a as $row) {
fputcsv($output, $row, $delimiter, $enclosure);
}
rewind($output);
$csvData = stream_get_contents($output);
fclose($output);
return file_put_contents($filePath, $utf8_bom . $csvData);
}
// 사용 예시
// 1. 문자열 데이터로 CSV 파일 생성
$csvContent = "이름,나이,직업\n홍길동,30,개발자\n김영희,25,디자이너\n";
$result = writeCSVWithBOM('output.csv', $csvContent);
// 2. 배열 데이터로 CSV 파일 생성
$a = [
['이름', '나이', '직업'],
['김영희', 25, '디자인'],
['박철수', 35, '기획자']
];
$result = arrayToCSVWithBOM('array_output.csv', $a);
* 같이보면 좋은글
- 캐릭터셋 구분함수 utf8 bom euckr cp949 > PHP
- 윈도우 CMD와 엑셀에서 CSV 텍스트파일 읽을때의 캐릭터셋
