Friday, June 19, 2009

groovy cgi

groovy파일을 cgi로 이용해 사용하는 장난(?)을 하다가, parameter를 받는 작업을 하던중, 제대로 처리하게 하지 못해서 애를 좀 먹었습니다.
한글이나 일본어가 깨지는 현상때문이었는데요. 파일도 utf-8(without BOM), 그리고 groovy.exe의 실행옵션에서 도움말에 있는 --encoding UTF-8 이나 -c UTF-8을 아무리 주어도 제대로 표시되지 않았습니다. 아파치의 설정이 잘못된 것인지도 보고, 옵션이 먹지 않는지 레지스트리의 .groovy파일 실행할 때 디폴트 옵션을 줘보기도 했습니다만, 해결은 다른 방법으로 되었습니다. 옵션에 -Dfile.encoding=UTF-8 을 주고 실행하는 것이었습니다.

아마도, 스펙대로라면 -Dfile.encoding=UTF-8 이 없어도 잘 표시되어야 할 것 같은데...., 잘 되지 않았습니다.

  1. #!C:\Progra~1\Java\groovy-1.6.0\bin\groovy.exe -Dfile.encoding=UTF-8  
  2. //C:\Progra~1\Java\groovy-1.6.0\bin\groovy.exe -c utf-8 -D file.encoding=UTF-8  
  3.   
  4. import java.net.URLDecoder;  
  5. def decoder = URLDecoder;  
  6.   
  7. print "Content-type: text/html\n\n"  
  8. print "<html><head><meta content='text/html; charset=utf-8' http-equiv='Content-Type'/></head><body>"  
  9. def name='World'; println "Hello $name!"  
  10.   
  11. /* == to show all env variables 
  12. def env = System.getenv() 
  13. for(k in env){ 
  14.  println(k) 
  15. } */  
  16.   
  17. def __form = [:]  
  18. def arrykeyvalue  
  19. def strQueryString = System.getenv()['QUERY_STRING']  
  20. if (strQueryString != null) {  
  21.  def arryForm = strQueryString.split('&')  
  22.  arryForm.each {  
  23.      arrykeyvalue = it.split('=')  
  24.      __form.put(arrykeyvalue[0], arrykeyvalue[1])  
  25.  }  
  26. }  
  27.   
  28. __form.each {  
  29.  print (it.key + ' = ' + it.value+ '<br>')  
  30. }  
  31.   
  32. __form.each {  
  33.  print (it.key + ' = ' + decoder.decode(it.value, "UTF8") + '<br>')  
  34. }  
  35.   
  36. print "日本語 <br> "  
  37. print "한국어 <br> "  
  38. print "</body></html>"  


html 태그가 있어 본문에 에러가 있다고 하니 일본어의 전각 괄호로 바꾸었습니다.
그리고 아래가 실행 내용입니다.




No comments: