소곤소곤 ad

2014년 1월 27일 월요일

한글이 포함된 문자열의 실제 크기는 얼마일까?

한글이 포함된 문자열의 길이를 구해보자.

String s = "소곤소곤abcd";
System.out.println(s.length()); // 8

String.length()는 한글이건, 영문이건 상관없이 우리가 인지하는 글자 갯수를 돌려준다.

String s = "소곤소곤abcd";

byte[] buf = s.getBytes(); // using DefaultCharset

System.out.println(buf.length);  // 16
이 경우는, 메모리상에 위치할 실제 바이트수를 알아낼 수 있다.  잠깐! 한글은 2바이트니깐 결과값이 12일텐데 16이라고??? 12도 맞고 16도 맞다. 내 시스템의 eclipse는 UTF-8로 세팅되어 있고, 여기서 한글 한글자는 3바이트를 차지한다. 즉, 결과값은 이 코드가 동작하는 시스템의 기본 인코딩이 뭐냐에 달려있다.

문제는 실행파일(apk 혹은 jar)을 배포했는데, 그게 돌아가는 환경에 따라 이 값이 다르게 나온다는 것이다. 그래서, 시스템 비의존적인 실제 바이트수를 알아낼 필요가 있다.

이때 쓸 함수가 getBytes(String EncodingCharsetName)이다.
String s = "소곤소곤abcd";
System.out.println(s.getBytes("UTF-8").length);
하지만 그냥은 런타임에러가 난다. 엔코딩실패를 대비해서 try catch로 감싸주어야 한다. 함수로 만들어 보았다.
public int getRealSize(String text)
{
    int size = -1;
    try {
        size = text.getBytes("UTF-8").length;
    } catch (UnsupportedEncodingException e1){
    
    }

    return size;
}

이종시스템간 데이터교환 (특히 클라이언트-서버방식의 게임)에서는 항상 주의해야 한다.

2013년 1월 30일 수요일

eclipse에서 프로젝트 복사하여 새프로젝트 시작하기

eclipse에서 프로젝트 복사하여 새프로젝트 시작하기 


 1. 파일시스템에서 workspace를 찾아 일단 폴더째로 복사한다.

 2. eclipse에서 import... from existing projects
이렇게 하면 복사한 프로젝트를 불러오는데 성공. 그러나 이대로는 컴파일이 안된다.

Search (Ctrl+H)를 이용하여 기존 패키지이름을 모두 찾아내서 새로운 패키지이름으로 모두 수정해야한다.

특히 xml 파일들에 주의. 잘못된 곳이 하나라도 있으면 "R.layout.main" 라인이 이유없이 당신을 괴롭힐 것이다.

2012년 12월 12일 수요일

BigInteger를 이용한 md5 함수

MessageDigest와 BigInteger를 이용하는 MD5 해시함수 MD5 hash function using MessageDigest and BigInteger

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

private static String md5hash(String input) 
{
    String md5 = null;

    if(null == input) return null;

    try {
        //Create MessageDigest object for MD5
        MessageDigest digest = MessageDigest.getInstance("MD5");

        //Update input string in message digest
        digest.update(input.getBytes(), 0, input.length());

        //Converts message digest value in base 16 (hex) 
        md5 = new BigInteger(1, digest.digest()).toString(16).toUpperCase();

    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    }
    return md5;
}