보물창고/Programming2014.08.07 23:00






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는 확인하기위한 명령으로 나중에는 제외해도 됩니다)



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


신고





Posted by 파란물










GIF파일을 AVI 파일로 인코딩할때 사용한 설정입니다

 


신고





Posted by 파란물
보물창고/Programming2011.08.24 23:01








안드로이드 get방식 데이터 u
rl 전달 한글 깨짐 인코딩 설정 방법 (안드로이드 URL 호출, 쓰기, jsp, android, euc-kr, utf-8, 디코딩, encode, decode, servlet, 서블릿)

안드로이드에서 GET방식 URL에 데이터를 쓸때
데이터를 전달받은 jsp 서블릿에서 받은 데이터중 한글이 깨지는 형상 해결 방법 입니다
ex) �������� ,  ???? ,  ã�±ã�·ã�´ã��ã�¹ 등등..








 

String contentText"일상";

String contentText2 = java.net.URLEncoder.encode(new String(contentText.getBytes("UTF-8")));

String getSql = "http://서블릿 주소?tn=neck_cold&con="+contentText2; 
                        

URL connect = new URL(getSql);

URLConnection urlConn = connect.openConnection();

HttpURLConnection httpCon = (HttpURLConnection)urlConn;

BufferedReader in = new BufferedReader(new InputStreamReader(httpCon.getInputStream()));

in.close();

 
전달 하는쪽 소스 입니다

밑줄 그은 부분이 해결 방법 입니다
contentText문자열에 인코딩을 해서 다시 스트링을 담게 됩니다 







 

response.setCharacterEncoding("EUC-kr");

String tableName = new String(request.getParameter("tn").getBytes("8859_1"),"UTF-8");

 
받는쪽 소스 코드 입니다 (서블릿)

첫번재줄 euc-kr은 웹브라우져에 출력할때 영향을 미칩니다
두번째줄 getByte이후는 db에 쓸때 영향을 미칩니다







이클립스 window -> Preferences => Workspace -> Text File encoding 을 손을 많이 댓었는데
default값 MS949로 해도 문제 없이 돌아갑니다 
 

 




참고한 블로그
http://ksprg.cafe24.com/?p=904
http://www.javadocexamples.com/java/net/URLEncoder/encode(String%20s,String%20enc).html




신고





Posted by 파란물