자바 String의 인코딩

자바의 인코딩에 대한 좋은 글이 있다. 결론만 이야기하면, 자바가 알아서 할테니 신경쓰지 말라.

이에 대한 테스트 코드를 붙여 본다. 좋은 글에 있는 코드를 참조한 것일 뿐이다.

public class StringTest
{
    public static void main(String args[])
    {
        String name = new String("정용식");
        byte[] strs;


        try
        {
            System.out.println( "original string:" + name );
            System.out.println( "default encoding:" + System.getProperty( "file.encoding" ));
            System.out.println( "========================");

            strs = name.getBytes();
            System.out.println( "length:" + strs.length );
            System.out.println( "hex:" + binary2Hex( strs ) );
            System.out.println( "value:" + new String( strs ) );
            System.out.println();

            strs = name.getBytes( "utf-8" );
            System.out.println( "length:" + strs.length );
            System.out.println( "hex:" + binary2Hex( strs ) );
            System.out.println( "value:" + new String( strs, "utf-8" ) );
            System.out.println();

            name = new String(strs, "utf-8");
            strs = name.getBytes();
            System.out.println( "length:" + strs.length );
            System.out.println( "hex:" + binary2Hex( strs ) );
            System.out.println( "value:" + name );
            System.out.println();

            name = new String(name.getBytes("euc-kr"), "utf-8");
            strs = name.getBytes();
            System.out.println( "length:" + strs.length );
            System.out.println( "euc-kr hex:" + binary2Hex( strs ) );
            System.out.println( "value:" + name );
            System.out.println();

            strs = name.getBytes("utf-8");
            System.out.println( "length:" + strs.length );
            System.out.println( "utf-8 hex:" + binary2Hex( strs ) );
            System.out.println( "value:" + name );
            System.out.println();
        }
        catch (Exception e)
        {

        }
    }

    public static String binary2Hex(byte[] buffer)
    {
        String res = "";
        String token = "";

        for( int i=0; i < buffer.length; i++)
        {
            token = Integer.toHexString( buffer[i] );

            if(token.length() > 2)
            {
                token = token.substring( token.length() - 2 );
            }
            else
            {
                for(int j = 0 ; j < 2 - token.length(); j++)
                {
                    token = "0" + token;
                }
            }
            res += " " + token;
        }

        return res.toUpperCase();
    }
}

위 코드에 대한 결과값은 아래와 같다.

original string:정용식
default encoding:x-windows-949
========================
length:6
hex: C1 A4 BF EB BD C4
value:정용식

length:9
hex: EC A0 95 EC 9A A9 EC 8B 9D
value:정용식

length:6
hex: C1 A4 BF EB BD C4
value:정용식

length:5
euc-kr hex: 3F 3F 3F 3F 3F
value:?????

length:15
utf-8 hex: EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD
value:?????


Process finished with exit code 0

 

참조

Error: Registry key ‘Software\JavaSoft\Java Runtime Environment’\CurrentVersion’ …

Error: Registry key 'Software\JavaSoft\Java Runtime Environment'\CurrentVersion'
has value '1.7', but '1.8' is required.
Error: could not find java.dll
Error: Could not find Java SE Runtime Environment.

레지스트리에 CurrentVersion은 1.7이지만, 실제로는 1.8이 필요하다라고 써있다. 보통 JDK를 설치/삭제 할때 저 값이 알맞게 업데이트 되지만 어떤 이유로 올바르게 적혀있지 않다는 것인데, 이를 해결하는 방법은 여기 에 적혀있다.

링크누르기 귀찮은 사람을 위해 정리하자면, 레지스트리에 가서 값을 고치는 방법을 통해 직접 시도할 수도 있지만, JDK를 설치(이미 설치되어 있다면, 삭제 후 설치)하는 방법이 제일 확실하다는 거다.

나 같은 경우는, 1.8을쓰다가 1.7로 다운그레이드하고자 1.8을 삭제했기 때문에 레지스트리의 CurrentVersion을 1.8로 올리는 방법은 적당하지 않았다. JDK7을 재설치하는 것으로 깔끔하게 해결되었다.

링크