$ is not defined 오류가 나타나는 것은 jQuery 가 제대로 로드 되지 못해서 그렇습니다.


해결 방법은 <head> </head>  안에 


<script type="text/javascript" src="경로"></script> 를 추가해 주시면 됩니다.



경로 부분엔 당연히 jQuery 경로가 들어가야겠죠?




아래는 제가만든 코드의  제이쿼리 로드 예제입니다.


 <!-- jquery load -->

 <script type="text/javascript" src="vendor/jquery/jquery.js"></script>



쉽죠? 




신고

com.sun.net.httpserver.HttpServer 을 이용해 java에서 간단한 웹서버를 만들었습니다.

만든 서버는 GET 방식을 이용해서 Request 받고 

결과를 처리해 줍니다. 


GET 방식으로 http의 주소에 붙어오는 key와 value를 JAVA 의 MAP에 매핑하고 싶었습니다.


그 방법을 메모해 둡니다.



public Map<String, String> queryToMap(String query)
{
    Map<String, String> result = new HashMap<String, String>();
    for (String param : query.split("&")) {
        String pair[] = param.split("=");
        if (pair.length>1) {
            result.put(pair[0], pair[1]);
        }else{
            result.put(pair[0]"");
        }
    }
    return result;
}



위의 함수가 GET 방식의 쿼리를 JAVA Map에 매핑후 리턴해 줍니다.


사용은 아래와 같이 하시면 됩니다.


Map<String, String> params = queryToMap(HttpExchange exchange.getRequestURI().getQuery())
System.out.println("param A=" + params.get("A"));




키가 A 인 값을 MAP 에서 찾아 출력해 줍니다.






신고
SimpleDateFormat 패턴 정리

기호의미보기
G연대(BC,AD)AD
y년도2012
M월(1~12월)7
w년의 몇 번째 주(1~53)28
W월의 몇 번째 주(1~5)2
D년의 몇 번째 일(1~366)194
d월의 몇 번째 일(1~31)11
F월의 몇 번째 요일(1~5)3
E요일
a오전/오후(AM,PM)PM
H시간(0~23)0
k시간(1~24)24
K시간(0~11)10
h시간(1~12)10
m분(0~59)22
s초(0~59)7
S천분의 1초(0~999)253
zTime zone(General Time Zone)GMT+9:00
ZTime zone(RFC 822 time zone)+0900





yyyy-MM-dd HH:mm:ss 와 같은 패턴을 위의 표를 참조하시면 쉽게 포멧을 만드실수 있습니다. 






신고

구글은 자사의 서비스를 여러방면으로 사용할수 있게 수많은 API를 제공합니다. 

이번에 게임을 제작하면서 각종 게임 벨런싱 문서들을 구글 스프레드시트에 올려두고 

기획자에게 스프레드시트의 권한을 제공한 다음 직접 문서를 수정하게 했습니다. 


다음은 JAVA 서버에서 기획자가 수정한 스프레드시트의 벨런싱 문서를 가져와서 서버에 적용하며, 

외국 사이트등을 참고해서 만든 구글 API를 이용한 스프레드시트 내용 긁어 오기 demo 입니다. 



우선 구글 api를 사용하기 위해서 구글 라이브러리를 다운 받아야 합니다. 

구글 라이브러리 다운[바로가기]




위와 같이 구글은 많은 언어의 라이브러리를 제공합니다. 


저희는 java 서버이니 java 라이브러리를 다운 받겠습니다. 




자바 라이브러리는 겁나 많습니다. 

총 43개나 되네요. 


근데 어느 사이트도 어떤 라이브러리를 추가해야 한다고 콕 찝어 주지 않았습니다. 

당연히 다 쓰진 않겠기에 필요해보이는 한두개를 추가하고 에러가나면 또 추가하고 하는 식을 몇개 추렸습니다. 


gdata-client-1.0.jar

gdata-client-meta-1.0.jar

gdata-core-1.0.jar

gdata-spreadsheet-3.0.jar

gdata-spreadsheet-meta-3.0.jar

일단 필요해 보이는 애들을 추가해가며 넣은거라 위에서 필요 없는 아이들도 있을수 있습니다.

우선은 이렇게 추가하면 컴파일 에러가 하나 발생합니다. 


이리 저리 찾아보니 또다른 라이브러리를 다운 받아야 하더군요

그녀석이 아래녀석입니다. 

guava-18.0.jar


위에 라이브러리를 추가하니 에러가 발생하지 않습니다. 


우선 사용자 인증을 해야합니다.

SpreadsheetService service = new SpreadsheetService("Gdata Test");
            service.setUserCredentials("계정 E-Mail""계정비번");

위에서 "Gdata Test"의 명은 아무것이나 입력해도 됩니다. 



그리고 내가 접근 가능한 계정의 스프레드시트 Full feed를 읽어 옵니다. 

URL metafeedUrl = new       URL("https://spreadsheets.google.com/feeds/spreadsheets/private/full");
            SpreadsheetFeed feed = service.getFeed(metafeedUrl, SpreadsheetFeed.class);
            List<SpreadsheetEntry> spreadsheets = feed.getEntries();


위에서 많이 헤멨습니다. 

주소 때문에요. 

당연히 스프레드시트의 주소를 넣어야 한다고 생각하여 스프레드 시트 주소를 넣고 돌렸지만 에러밖에 나지 않습니다. 

꼭 "https://spreadsheets.google.com/feeds/spreadsheets/private/full" 이주소를 넣어 주셔야합니다.


해당 주소를 직접 들어가보시면 아시겠지만, 내가 접근 가능한 스프레드시트의 full feed를 보여주는 주소입니다. 

feed를 받은 다음 그 feed를 파싱해가며 접근하는 구조인가 봅니다. 


다음은 데모코드 입니다. 



 import com.google.gdata.client.spreadsheet.*;

import java.net.URL;
import com.google.gdata.data.spreadsheet.*;
import java.util.*;

public class GdataTest {

    /**
     * @param args
     */

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        
        try{
            SpreadsheetService service = new SpreadsheetService("Gdata Test");
            service.setUserCredentials("""");
            
            URL metafeedUrl = new       URL("https://spreadsheets.google.com/feeds/spreadsheets/private/full");
            SpreadsheetFeed feed = service.getFeed(metafeedUrl, SpreadsheetFeed.class);
            List<SpreadsheetEntry> spreadsheets = feed.getEntries();
            
            for(int i=0; i< spreadsheets.size(); i++) 
            {
                SpreadsheetEntry entry = spreadsheets.get(i);
                if(entry.getTitle().getPlainText().equals("스프레드시트 파일 이름")) // 파일 타이틀
                {
                     List<WorksheetEntry> worksheets = entry.getWorksheets()// 시트 타이틀
                    for(int k=0;k< worksheets.size();k++)
                    {
                         WorksheetEntry worksheet = worksheets.get(k);
                         System.out.println(worksheet.getTitle().getPlainText());
                         
                         URL cellFeedUrl = worksheet.getCellFeedUrl();
                         CellFeed cellFeed = service.getFeed(cellFeedUrl, CellFeed.class);
                         for (CellEntry cell : cellFeed.getEntries()) 
                         {
                             System.out.println("getPlainText : "+cell.getTitle().getPlainText())// value의 위치
                             System.out.println("getValue : "+cell.getCell().getValue())// value의 내용
                         }
                    }
                }
            }
            
        }catch(Exception e){
            e.printStackTrace();
        }
    }

}

데모코드를 돌려보면, // 파일 타이틀 부분

"스프레드시트 파일 이름" 이라는 문서를 만나면

// 시트 타이틀 부분 에서 시트의 개수만큼 for 문을 수행하며, 그 안에 내용들을 긁어와서 화면에 찍어줍니다. 


System.out.println("getPlainText : "+cell.getTitle().getPlainText())// value의 위치

System.out.println("getValue : "+cell.getCell().getValue())// value의 내용


두부분이 실제적으로 안의 내용을 찍어주는 역활을 합니다. 

getPlainText : A22

getValue : store_list

getPlainText : B22

getValue : store_price


결과는 위와 같이 찍힙니다. 


A22셀의 내용은 store_list

B22셀의 내용은 store_price 


위와같이 22번 셀을 기준으로 A -> B 순으로 오른쪽으로 순차적으로 읽어 오네요. 









개발후 결론 

생각보다 무지 느려요. '-' 못써요. 

진짜 벨런싱 수정용으로 밖에 못쓸거 같아요. 

게임 서비스 하면서도 각종 설정파일들을 읽어와서 서버에 실시간 적용을 위해서 

구글의 막강한 스프레드시트를 이용해서 개발한건데 ㅠ.ㅠ 너무 너무 느려서 서비스중인 게임엔 적용이 힘들것 같구요. 


기획자들의 편의를 위해 사용하자는 기존의 목적대로 밖에 못쓸것 같습니다. 

기획자들은 적용이 완료될때까지 기다려 줄테니까요 ^ㅡ^


결론2

기획자들의 편의를 위해 제공한다면 굳이 구글 스프레드시트가 아닌 엑셀파일이나 더 쉽게는 csv 파일을 제공하여, 

그 파일에서 직접 읽어오는게 속도는 훨씬 빠릅니다. 


결론3

그래도 구글 스프레드시트를 이용하면 웹이접근되는 모든 공간에서 수정과 실시간 반영을 해줄수 있으니, 

또 나름 괜찮아요 ^ㅡ^





신고
  1. G.J. 제이 2015.03.07 16:56 신고

    개발자분들에게 유용한 정보인가요?
    그런데 적샷굿샷님 태그 위의 광고인가. 웹 페이지를 찾을 수 없다고 예전부터 계속 뜨네요!

    • 적샷굿샷 2015.03.09 09:03 신고

      헙~ 저는 빈공간으로 표시되서 그냥 두고 있었는데 ^^

      다음뷰 입니다.
      서비스 종료해서 이제 안나와요 ㅋㅋㅋ

      스킨 수정해야겠네요.
      알려 주셔서 감사드립니다.

  2. 준호 2016.01.13 10:08 신고

    이 소스 안드로이드 스튜디오 에서도 활용가능한가요?? 구글스프레드시트 기능을 사용해서

    필요한정보를 사용자에게 전달해주는 방식으로 만들어보고싶은데

    • 적샷굿샷 2016.01.17 21:21 신고

      실제로 저희팀 클라이언트분이
      안드로이드에서도 사용을 했었습니다.

      속도만 빠르면 별도의 서버운영 없이
      간단한 게임의 유저DB 로도 충분히 사용할수 있을텐데

      속도가 너무 느려서 포기했어요 ^^

요즘 자바 GUI를 이용해서 게임 서버 관리툴을 만들고 있습니다. 

요즘은 관리툴을 모두 웹으로 만들고 있는 추세이지만, 일정이 촉박하여 아무래도 손에 제일 익은 자바로 

후딱 만들고 있어요 ^^


자바 스윙을 이용해서 메인 Frame을 생성하면 화면의 좌측 상단에서 부터 창이 생깁니다. 


멋없죠 '- ' ;;;



화면 가운데 띄우고 싶어서 이것 저것 찾아보고 메모차원에서 남겨둡니다. 


  1. // 창 화면 중간에 띄우기
  2. // 프레임의 사이즈를 구합니다.
  3. Dimension frameSize = this.getSize();
  4. // 내 모니터의 크기를 구합니다.
  5. Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
  6. /*
  7. * 그래서 프레임의 위치를
  8. * (모니터화면 가로 - 프레임화면 가로) / 2,
  9. * (모니터화면 세로 - 프레임화면 세로) / 2 이렇게 설정한다.
  10. */
  11. this.setLocation((screenSize.width - frameSize.width)/2(screenSize.height - frameSize.height)/2);
  12.        
  13. setResizable(false)// 프레임 크기 조절을 할수 없게 만듭니다.
  14. setVisible(true);    // 프레임을 보여줍니다.







이렇게 하면 끝 ^ㅡ^ 


참 쉽죠?






신고

Java의 try catch 문은 만능이죠 ^^


트라이 캐치 문 안에서 강제로 Exception을 발생 시켜서 catch 문에 걸리게 할수 있습니다. 



try 
{
    if(this.uid<10)
    {
        throw new Exception();
    }
} catch (Exception e) 
{
    e.printStackTrace();
}


위와 같이 쓰시면 uid가 10보다 작을때  catch 문에 걸립니다. 



응용 하시면


try 
{
    if(this.uid<10)
    {
        throw new Exception(e2);
    }
} 
catch (Exception e) 
{
    e.printStackTrace();
}
catch (Exception e2) 
{
    System.out.println(e2);
}


이렇게도 쓰실수 있어요






이렇게 하면 강제 Exception이 catch e2에 걸리겠죠?


^ㅡ^




신고
  1. 황금너구리 2014.07.07 18:56 신고

    황금너구리 오랜만에 들렸다가 갑니다^^ 요 몇일 간 건강이 좋지 않아 오랫동안 블로그 방문을 못했네요. 건강이 정말 중요한거 같아요.^^ 행복한 하루되시길 바래요~

    • 적샷굿샷 2014.07.08 09:19 신고

      방문해 주셔서 감사합니다.

      저도 요 몇일 블로그에 글을 못올리고 있네요 ^^ 하핫

  2. 어듀이트 2014.07.08 22:50 신고

    잠시 인사드리고 갑니다`
    편안한 저녁 되시길 바래요`



java.lang.NoClassDefFoundError: WCsTool/WCsTool

Caused by: java.lang.ClassNotFoundException: WCsTool.WCsTool

at java.net.URLClassLoader$1.run(Unknown Source)

at java.security.AccessController.doPrivileged(Native Method)

at java.net.URLClassLoader.findClass(Unknown Source)

at java.lang.ClassLoader.loadClass(Unknown Source)

at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)

at java.lang.ClassLoader.loadClass(Unknown Source)

Exception in thread "main" 




잘되던 프로젝트가 위와같은 에러를 뿜어 내며 죽었다 '-' 



컨트롤 + Z 로 돌려도 마찬가지다


문제는 java build path에 추가했던 라이브러리를 삭제하면서 빌드 패스를 삭제해 주지 않아서이다.




Properties - java build path 의 Libraries 에 X 표시된 라이브러리가 있을겁니다.

지워주세요. 





신고

JFileChooser jfc = new JFileChooser();
jfc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
jfc.showDialog(this, null);

File dir = jfc.getSelectedFile();
jt_save_path.setText(dir!=null?dir.getPath():"");



버튼 이벤트에 위와 같이 넣으면 DIRECTORIES_ONLY에 의해 폴더만 선택이 가능한 

파일 탐색창이 뜹니다. 


해당 경로를 선택하면 jt_save_path 부분에 해당 path를 저장합니다. 





출처 : http://happy2ni.egloos.com/2838029





신고
  1. 감사합니다! 많은도움됏어요 2016.07.22 09:35 신고

    ㅋㅋㅋ감사합니다 짧고굵네여

   

String fileName = file.getName();


를 이용해서 fileName에  파일 이름을 담습니다. 


 int Idx = fileName .lastIndexOf(".");
를 이용해서 .뒤에 있는 인덱스 값을 지정 합니다. 

String _fileName = fileName.substring(0, Idx );

이렇게 해주시면 _fileName에 확장자를 제외한 파일명이 담깁니다. 






참 쉽죠? ^ㅡ^





신고


Java String 에서 해당 String 포함 되어 있는지 판별하기 위해 


 boolean java.lang.String.contains(CharSequence s) 클래스를 씁니다.



사용법은 


String tempStr = "포함되어";

String str = "포함되어 있나요?";

if(str.contains(tempStr ))

{

 // 포함되어 있어요~~

}else

{

// 포함 되어 있지 않습니다.

}    



대략 위와같이 쓰시면 됩니다.






신고


아무리 노력을 해도 나타나지 않는 스크롤바!!!!!!! 

극적으로 해결했습니다.



1 JPanel jpList = new JPanel(); 2 jpList.setLayout(new GridBagLayout()); 3 JScrollPane scrollSingle = new JScrollPane(jpList, ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS, 4 ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); 5 scrollSingle.setPreferredSize(new Dimension(400, 200));




기본적으로 GridBagLayout() 사용하면 계속 크기를 늘리며 추가된다.

개념을 잘못 이해했습니다. 


스크롤에 크기를 주고 GridBagLayout에 삽입하고


그후엔 jpList 에 무한정 추가하여도 JScrollPane 크기를 벗어나면 자동 스크롤이 되어집니다.


위의 파란 코드는 무조건 스크롤이 표시되도록 하는 코드이고


붉은 부분은 스크롤의 크기를 고정해 주는 코드 입니다.


scrollSingle.setSize(400,200); 으로 백날 해봐야 크기 지정이 되지 않았는데,


scrollSingle.setPreferredSize(new Dimension(400, 200)); 을 쓰시기 바랍니다.







신고



Main.java

  

   1 public class Main

  2 { 
  3     public static void main( String[] args ) throws Exception
  4     { 
  5         JarFileLoader.addFile( "c:/workspace/mavenWork/jarClassLoader/lib/commons-io-2.0.1.jar" ); 
  6         JarFileLoader.addFile( "c:/workspace/mavenWork/jarClassLoader/lib/commons-lang-2.5.jar" ); 
  7         JarFileLoader.addFile( "c:/workspace/mavenWork/jarClassLoader/lib/commons-logging-1.1.1.jar" ); 
  8         JarFileLoader.addFile( "c:/workspace/mavenWork/jarClassLoader/lib/jcl-over-slf4j-1.5.10.jar" ); 
  9         JarFileLoader.addFile( "c:/workspace/mavenWork/jarClassLoader/lib/log4j-1.2.15.jar" ); 
 10         JarFileLoader.addFile( "c:/workspace/mavenWork/jarClassLoader/lib/slf4j-api-1.5.10.jar" ); 
 11         JarFileLoader.addFile( "c:/workspace/mavenWork/jarClassLoader/lib/slf4j-log4j12-1.5.10.jar" ); 
 12         Logger LOGGER = LoggerFactory.getLogger( Main.class ); 
 13         LOGGER.info( "ok" ); 
 14     } 
 15      
 16 } 
 17 

JarFileLoader.java
  1 import java.io.File;
  2 import java.io.IOException;
  3 import java.lang.reflect.Method;
  4 import java.net.URL;
  5 import java.net.URLClassLoader;
  6 
  7 public class JarFileLoader
  8 {
  9 	@SuppressWarnings( "rawtypes" )
 10 	private static final Class[]	parameters	= new Class[] { URL.class };
 11 	
 12 	public static void addFile( String s ) throws Exception
 13 	{
 14 		File f = new File( s );
 15 		addFile( f );
 16 	}
 17 	
 18 	public static void addFile( File f ) throws IOException
 19 	{
 20 		addURL( f.toURI( ).toURL( ) );
 21 	}
 22 	
 23 	public static void addURL( URL u ) throws IOException
 24 	{
 25 		URLClassLoader sysloader = ( URLClassLoader ) ClassLoader.getSystemClassLoader( );
 26 		Class< URLClassLoader > sysclass = URLClassLoader.class;
 27 		try
 28 		{
 29 			Method method = sysclass.getDeclaredMethod( "addURL" , parameters );
 30 			method.setAccessible( true );
 31 			method.invoke( sysloader , new Object[] { u } );
 32 		}
 33 		catch ( Throwable t )
 34 		{
 35 			throw new IOException( "Error, could not add URL to system classloader" );
 36 		}
 37 	}
 38 }



저는 주로 lib 폴더를 만들어 모든 jar 파일을 다 때려넣고 다같이 묶어 버리지만 

위와 같은 방법도 유용하게 쓰일것 같아 메모차원에서 남겨둡니다. 


소스는 파일은 세바니 님의 블로그에 있으니 아래 링크를 타고 가셔서 받으시면 됩니다.






출처 : http://seban21.blog.me/70163915184







신고

지난번엔 자바의 Timer class를 이용한 타이머를 포스팅 했었는데요.

Timer class를 이용한 타이머 만들기 바로가기 : http://ince.co.kr/261


이번엔 ScheduledExecutorService Class 를 이용해 타이머 만들기를 포스팅해보겠습니다. 



//타이머 시작

  1 ScheduledExecutorService testTimer = Executors.newSingleThreadScheduledExecutor();
  2 testTimer.scheduleAtFixedRate(new TestTask(), 0, 1, TimeUnit.SECONDS); // 1초마다 체크    

main() 함수 같은곳에 위와같이 적으면 타이머가 구동됩니다. 


아래는 실제로 타이머가 구동되는 Thread 입니다.


  1 class TestTask implements Runnable { // 1초마다 체크 
  2     public void run() {
  3                 System.out.println("타이머 달려 달려!!!!"); 
  4         } 
  5 };



초 주기를 변경하고 싶으면 선언부에서 


testTimer.scheduleAtFixedRate(new TestTask(), 0, 30, TimeUnit.SECONDS); // 30초마다 체크


과 같이 변경해 주면 간단하게 됩니다.



참 쉽죠?







신고
  1. 잉여토기 2013.04.19 00:39 신고

    와, 이렇게 하면 타이머를 직접 만들 수 있는 건가요?
    신기하네요.

 

run() 함수를 이미

쓰레드에서 쓰고 있는 관계로

 

타이머를 아래와 같이 두줄로 쇼부 봤습니다.

 

Timer tm = new Timer();
  tm.schedule(new TimerTask(){public void run(){
   try{
    saveLog();
   }catch(Exception e){System.out.println("SaveError : "+e);}
   }}, 10);

 

 

run() 함수도 같이 넣어 버렸어요.  ㅋㅋ




신고
  1. 잉여토기 2012.06.11 23:24 신고

    스톱워치 같은 건가요?
    비전문가인 저같은 사람들도 이해할 수 있게끔
    실행 캡처 같은 것도 있으면 더 좋을 것 같아요.

  2. Isabel Marant shoes 2012.06.13 10:57 신고

    스톱워치 같은 건가요?

  3. 적샷굿샷 2012.06.28 15:22 신고

    실제로
    Timer tm = new Timer();
    tm.schedule(new TimerTask(){public void run(){
    try{
    GetInit(); // init 값 초기화
    }catch(Exception e){}
    }}, 60*60*1000, 60*60*1000); //DB 연결유지 1시간간격

    이런형식으로 쓰고 있어요
    GetInit() 함수를 1시간 간격으로 계속 호출 하는거죠.

 

 

 

 

 

지난번엔 자바와 자바스크립트간의 소켓통신에서

한글 깨짐 해결법에 대해서 포스팅 했었습니다.

 

아래글 참조

http://ince.co.kr/255

 

 

이번에는 java에서 JDBC를 이용해 DB에 한글을 기록할때

어김업이 한글 깨짐 문제가 발생했습니다.

 

해당 문제를 해결하기 위해선

JDBC 설정시 아래와 같이 설정하시면 됩니다.

 

conn = DriverManager.getConnection(

"jdbc:mysql://localhost:3306/DB명?useUnicode=true&characterEncoding=euckr"

,ID,PASSWORD);

 

 

그럼 이만 꾸벅 ^ㅡ^ //




신고



오랜만에 블로그 포스팅을 하게 되네요 ^^
그간 이직 하고 하고 싶던 프로그래밍 원없이 했습니다.

이제좀 프로그래머로서의 삶을 다시 사는 느낌이네요.

이번 프로젝트 진행중에 발생한 문제를 해결하며
메모차원에서 포스팅을 남겨둡니다.

한글을 전송함에 있어서 여러 가지 문제점들이 많이 발생하는것은 모두들 아실텐데요.
웹게임을 만들면서

DB -> java 데몬 -> javaScript 로 데이터를 전송하며 모두 UTF-8 로 처리했지만
어김없이 한글 깨짐 현상이 발생했습니다.

아마도 DB->java 데몬 으로 옮겨 오면서 UTF-8 처리가 제대로 되지 않은걸로 추측됩니다.



이문제에 대해서 해결한 방법을 아래에 적었습니다.
 java
 URLEncoder.encode("한글","UTF-8")
 URLDecoder.decode("한글","UTF-8")


java script
 function urldecode (str) { 
    return decodeURIComponent((str + '').replace(/\+/g, '%20'));  // 공백 문자인 + 를 처리하기 위해 +('%20') 을 공백으로 치환
  }
위와 같이  URL 엔코더와 디코더를 이용해서 문제를 해결했습니다.




URL 엔코더의 경우 주로 검색창에 한글로 검색했을 경우
검색된 페이지의 url을 보시면 "검색+한+글자" 와 같은 것을들 자주 볼수 있었을 텐데요.

URL로 엔코딩후 다시 디코딩을 하면 공백에 + 기호로 처리되어 위의
java Script 에서도 + 기호가 모두 들어간채로 디코딩 되었습니다.

그래서 위와 같은 함수를 만들었습니다.
핵심은 decodeURIComponent((str + '').replace(/\+/g, '%20'));  // 공백 문자인 + 를 처리하기 위해 +('%20') 을 공백으로 치환
이부분 입니다.

+를 만나면 그냥 공백으로 치환해 버리는거죠 '%20' <-- 요놈이 + 기호 입니다.

좀 불편하긴 하지만 한글이 깨지지 않고 다른 언어들 간에 전송을 할수 있는 방법으로는
이방법이 제일 안전하고 괜찮아 보입니다.


저도 인터넷 뒤져가며 배우고 만든거라 다시 인터넷으로 돌려드릴겸
그리고 다음에 또 사용할때를 대비해서 메모도 해둘겸 포스팅을 남깁니다.

모두들 유용하게 이용하시길 ^^








신고
  1. gsbob 2012.06.27 14:46 신고

    감사합니다.
    문제가 말끔히 해결됐네요 ㅎㅎ

    이 내용 참고해서.. 블로그에 포스팅좀 해도 되죠??^^

    • 적샷굿샷 2012.06.28 15:20 신고

      해결되셨다니 다행이네요

      출처만 밝혀주신다면
      어디든 퍼가셔도 좋아요 ^^

+ Recent posts

티스토리 툴바