보물창고/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 파란물
보물창고/Programming2011.08.11 15:54






자바 jdbc 코딩을위한 드라이버 파일 입니다 검색해서 안나와 찾다가 db2계정에서 찾아 공유합니다

서버 컵퓨터에 있는 db2에 접근하기위해 사용하는 jar파일이니다
 

 

db2jcc4.jar

db2jcc.jar


 


JDBC 3.0이하의 기능을 사용하고자 할 경우, db2jcc.jar 파일을
JDBC4.0 이상의 기능을 포함하는 SQLJ또는 JDBC를 사용하고자 하면 db2jcc4.jar를 사용합니다




이클립스에서 라이브러리 추가해주면 사보 사용 가능합니다
프로젝트에서 우클릭 -> Properties -> java Build Path를 선택하후
Libraries에서 Add External JARs... 를 클릭후 위에 있는 원하는 라이브러리를 추가하시면 됩니다



db2에 접근해서 데이터 가져오는 자바 코드 전체 입니다
 

import java.sql.*;

 

public class db2connect1 {

       public static void main(String args[]) {

             Connection conn = null;

             Statement stmt = null;

             try {

                    System.out.println("Class UP");

                    Class.forName("com.ibm.db2.jcc.DB2Driver");

                    System.out.println("Class ok");

                    conn = DriverManager.getConnection("jdbc:db2://서버주소:포트번호/디비이름", "계정아이디", "비밀번호");

                    System.out.println("connect ok");

                    stmt = conn.createStatement();

                    ResultSet rs = stmt.executeQuery("select * from neck_cold");

                   

                    while(rs.next())

                    {

                           System.out.println(rs.getString(1));

                    }

             }

             catch(ClassNotFoundException ee) {

                    System.out.println("ClassNotFoundException");

             }

             catch(SQLException ee) {

                    System.out.println(ee.toString());

             }

             finally {

                    try {

                           stmt.close();

                    }

                    catch(Exception ee) {

                    }

                    try{

                           conn.close();

                    }

                    catch(Exception e1) {

                    }

             }

       }

}

 
 



설치 관련 참고글
http://publib.boulder.ibm.com/infocenter/db2luw/v9/index.jsp?topic=/com.ibm.db2.udb.apdv.java.doc/doc/t0010264.htm
 

 


신고





Posted by 파란물