한글 파일명으로 xlsx 파일들을 생성했다. 그리고 그걸 7z으로 압축했다. 7z 압축은 exec() 함수를 사용했다. 얼레, 그런데 다운받아서 압축을 푸니까 웬걸 한글 파일명이 다 깨진다. 한글 파일명이 깨질까 봐 7z으로 압축한 건데 왜지?!

커맨드라인 locale이 utf-8이 아니기 때문에 벌어진 일이다. exex() 함수는 새로운 터미널 세션을 만들어 실행을 하나 보다. 즉, 내가 터미널에 로그인했을 때와 환경이 같지 않다는 말이다. 그래서 환경설정을 해 줘야 하는데… locale은 아래처럼 PHP 명령을 내려서 설정해 주면 된다.

putenv("LANG=ko_KR.UTF-8");

이렇게 할 수도 있다.

setlocale(LC_ALL, 'ko_KR.utf8');

둘 간의 차이를 찾아 보진 않았다. setlocale 관련해서는 ‘PHP basename등 함수 사용시 한글깨짐(훼손) 문제’ 참고.