요즘 이기종 플랫폼에서 서비스를 위해 작업을 하다보니 많은 내용들을 새롭게 알게 됩니다. 정말 배우는 즐거움이란...^^
어제 오늘 열심히 파헤친 분야는 바로 Encoding ... 어제는 W3C 사이트에서 많은 자료를 읽고, 오늘은 UTF-8 처리에 대해 Survey 를 하였다. 그러면서 개발 환경을 모두 UTF-8 로 바꾸기 위한 작업도 함께 했다.
제일 먼저 한건 eclipse 에서 기본 encoding 을 UTF-8 로 바꾼 것..
자주 쓰는 텍스트 에디터인 AcroEdit 도 UTF-8 으로 변경
윈도우에서 FreeBSD 에 접속하기 위해 Zterm 을 주로 썼는데, UTF-8 이 안되는 이유로 Putty 로 변경
어서 모든 환경에서 UTF-8 만 쓰였으면 좋겠다는 말도 안되는 생각을 하며...
개발하고 있는 부분에 UTF-8 처리를 구현하는 과정에서 알게 된 팁 한가지.. 어찌보면 정말 당연한 것인데 한참 헤맬뻔 했다.
바로 소켓 통신시 인코딩 문제.. 보통 String 데이터를 보내기 위해 getBytes() 를 하는데, 이때 charset 을 지정하지 않으면 시스템의 기본 설정으로 인코딩 된다는것... 이 좋은 사실을 알려준 사이트는 여기.
위 사이트에 있는 것처럼 코드를 작성하여 돌려보았다.
public class EncodingTest {
public static void main(String[] args)
{
System.out.println("file.encoding=" + System.getProperty("file.encoding"));
}
}
public static void main(String[] args)
{
System.out.println("file.encoding=" + System.getProperty("file.encoding"));
}
}
내 FreeBSD 6.2 에서 돌려본 결과
file.encoding=ISO8859-1
윈도우 XP 에서 돌려본 결과는
file.encoding=MS949
Linux 에서 돌려보니
file.encoding=EUC-KR
이렇게 나오는것이다. 만약 이 세 머신들이 각각 소켓통신을 하면서 아스키 이외의 문자를 주고 받는다면 그 결과는 뻔한것 아닌가...
소켓 프로그래밍을 하는 데 있어 꼭 필요한 팁이 아닌가 싶다.
update : 글을 올리고 위의 블로그를 보다보니 좋은 내용이 있어서 공유합니다.
javascript 의 escape 함수를 java로 구현
public static String escape(String string){
StringBuffer sb = new StringBuffer();
String ncStr = "*+-./0123456789@ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz";
char c;
for(int i=0;i<string.length();i++){
c = string.charAt(i);
if(c>0x7f)
sb.append("%u" + Integer.toHexString((int)c).toUpperCase());
else if(ncStr.indexOf((int)c)==-1){
sb.append('%');
if(c<=0xf)
sb.append('0');
sb.append(Integer.toHexString((int)c).toUpperCase());
}
else
sb.append(c);
}
return sb.toString();
}
StringBuffer sb = new StringBuffer();
String ncStr = "*+-./0123456789@ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz";
char c;
for(int i=0;i<string.length();i++){
c = string.charAt(i);
if(c>0x7f)
sb.append("%u" + Integer.toHexString((int)c).toUpperCase());
else if(ncStr.indexOf((int)c)==-1){
sb.append('%');
if(c<=0xf)
sb.append('0');
sb.append(Integer.toHexString((int)c).toUpperCase());
}
else
sb.append(c);
}
return sb.toString();
}
댓글을 달아 주세요