본문 바로가기

보물창고/Programming

PHP exec()로 java 실행해서 파일 저장할때 한글 깨짐 문제 해결

반응형


PHP exec()로 java 실행해서 파일 저장할때 한글 깨짐 문제 해결






PHP코드에서 exec()를 이용해 java jar를 실행할때 한글이 깨지는 문제로 일주일을 고생했습니다
검색해보니 저와 비슷한 문제로 질문글 들이 있었으나.. 해결을 했다는 답변이 없어 서더욱 힘들었습니다




제가 가진 문제점은

  • php코드 내에서 아래와 같이 실행을 합니다 
    (%ED%95%9C%EA%B8%80는 "한글"을 URL인코딩한 값) 
    exec("java -jar myjava.jar %ED%95%9C%EA%B8%80");

  • myjava.jar에서 하는 일은 
    String hanVar = URLDecoder.decode(arg[0], "utf-8"); // %ED%95%9C%EA%B8%80 -> 한글 
    System.out.println(hanVar ); //모든 경우에 한글로 잘 출력됩니다 
    ImageIO.write(srcImageBuffer, "gif", new File(hanVar)); // hanVar이름으로 파일 저장

java -Dfile.encoding=utf-8 -jar myjava.jar %ED%95%9C%EA%B8%80 
이 명령을 리눅스 shell에서 실행하면 한글파일로 저장이 잘 됩니다 
그러나 문제는 php에서 exec()로 실행하면 한글 파일이 ???로 저장됩니다





해결의 실마리는 locale명령어였습니다

리눅스에 ssh로 접속해서 locale명령을 하면 다음과 같습니다 
(www-data는 Apache서버 user로 보여 같이 확인했습니다)



모두 utf-8로 잘 나옵니다
그러나..

php에서 exec("locale")를 하니 다음과 같이 나왔습니다



LANG=C로 시스템 디폴트 값을 쓴다고 설정되어 있습니다

PHP에서 exec()로 실행할때 설정된 인코딩이 달라 문제였습니다

해결 방법은 간단했습니다

exec("export LANG=\"ko_KR.utf8\";locale";<추가 명령어>) 이런식으로 명령 앞에 인코딩을 변경하는 문을 날리고 뒤에 필요한 명령을 하면 한글표시가 잘 되었습니다 (중간에 들어있는 locale는 확인하기위한 명령으로 나중에는 제외해도 됩니다)



이렇게 설정하고 나서는 한글파일 이름으로 잘 저장 되었습니다


반응형