본문 바로가기
  • fishing...
  • eating...
MISCELLANEOUSNESS

[JAVA] Socket 한글 실어 보내기..

by 회색뿔 2007. 9. 25.


아래 설명은 클라이언트 관점에서 기술한 것인데..

서버 측도 해보시면 금방 아실 듯..^^



1.입력 I/O방식의 차이로 인한 한글 깨짐

기존의 입력 중 예제로 가장 많이 쓰이는 방법은 아래 방법이다..

int c;
Stringbuffer[] str =  new StringBuffered( 128 );
whilet( ( c = System.in.read()  ) != '\n" )
{
       str.append( (char) c );
}

pw.println( str.toString() );
이방법은 1byte 단위로 입력을 받기 때문에 한글이나 특수 문자 입력에는 적합하지 않다.
소켓의 차이가 아니라 그냥 단순히 입력의 잘못으로 한글이 전송이 안되는 것이다.

따라서 아래와 같은 방법을 사용한다.

InputStream, OutputStream은 일반적으로 byte단위의 I/O를 사용한다.
한글우 byte 단위의 I/O를 하게 되면, 글자 자체가 깨질 위험이 있다.
Java에서는 문자나 문자열을 다룰때, 16bit-Unicode방식을 제공한다. I/O할 때, 이렇게 16bit-Unicode를 사용하는 I/O class들을 readers, wirters이다.

InputStreamReader hIsr = new InputStreamReader( System.in );
BufferedReader hBr = new BufferedReader( hIsr );
   
while( true )
{
       System.out.print( "Client: " );
       if( ( inStr = hBr.readLine() ) != null )
       {
              pw.println( inStr.toString() + "\n" );
              pw.flush();
     
              ReciveStr = br.readLine();    
              System.out.println( "Server: " + ReciveStr );
       }
       else
              break;
}
위 방법은 문자열을 한줄씩 입력받아 전송하는 코드이다...
바이트 단위가 아니라 문자열 단위이기 때문에.. 바이트 때문에 깨지는 현상은 없다..

2. 언어가 다른 소켓을 사용할 경우..
자바에서 보낼 문자열은 "8859_1"으로 변환하여 보내고,
C로부터 온 스트링은 8859_1 --> KSC5601로 변환하여 사용하면 됩니다.
 try
{  
       socket = new Socket(ss,cnt);
       InputStream in = socket.getInputStream();
       OutputStream out = socket.getOutputStream();
       String send_msg = "어쩌고 저쩌고";
       // JAVA 에서 C로 보낼 문자열을 8859_1로 변환시킴.
       bw.write( (CharConversion.K2E(send_msg)).getBytes("8859_1") );

       byte[] receive_msg = read_data(in);
       // C에서 JAVA로 온 문자열을 KSC5601로 변환시킴.
       System.out.println( CharConversion.E2K( new String(receive_msg, "8859_1") ) );
       ..............
       }
       finally
       {
               .....
       }
}

위와 같이 스트림을 변환(?) 시켜서 사용하면 된다.
각 언어마다 고유한 언어 표준이 존재 하니 적절히 바꿔서 쓰면 되겠다.


참고 사이트 : 자바누리





'MISCELLANEOUSNESS' 카테고리의 다른 글

windows 보안 정책 적용하기  (0) 2007.10.10
[검색 알고리즘] Stemming 알고리즘  (0) 2007.09.22
[검색 알고리즘] TF/IDF  (0) 2007.09.21