반응형


인코딩 변경을 하려고 보통 이렇게 하는데 이것은 잘못된 결과를 발생시킨다.

String strutf8 = new String(str.getBytes("utf-8"), "euc-kr") ;

getBytes는 지정된 charset의 byte array로 변환하는 것이고, String() constructor에서는 입력받은 데이터를 지정한 charset으로 인식하여 스트링을 만들겠다는 것이다. 즉, 원하는대로 charset 변경이 안 이루어진다.!!!!


타 시스템에서 다른 인코딩(euc-kr)을 사용하고 있는데 연동을 해야하는 일이 있었다. 부득이하게 charset 변경을 해야해서 바이너리값을 찍어서 직접 비교해봤다.

아래는 테스트 결과 성공.


+ UTF-8 -> euc-kr

//이클립스 환경설정의 인코딩 스타일이 UTF-8로 지정된 경우.
String utfstr = “한글인코딩" ;

Charset utf8charset = Charset.forName(
"UTF-8");
Charset iso88591charset = Charset.forName("euc-kr");
ByteBuffer inputBuffer = ByteBuffer.wrap(utfstr.getBytes());

// decode UTF-8
CharBuffer data = utf8charset.decode(inputBuffer);
// encode ISO-8559-1
ByteBuffer outputBuffer = iso88591charset.encode(data);
byte[] outputData = outputBuffer.array();

System.out.println("euckr?="+bytesToHex(outputData));

<끝>

final protected static char[] hexArray = "0123456789ABCDEF".toCharArray();
public static String bytesToHex(byte[] bytes) {
   
 char[] hexChars = new char[bytes.length * 2];
   
 for ( int j = 0; j < bytes.length; j++ ) {
       
 int v = bytes[j] & 0xFF;
        hexChars[j * 2] =
 hexArray[v >>> 4];
        hexChars[j * 2 + 1] =
 hexArray[v & 0x0F];
    }
   
 return new String(hexChars);
}



+ Recent posts