출처 : http://jongsclub.com/webedit/studyView.jsp?num=28
utf-8 인코딩을 이용한 한글 url 처리 [ 조회수: 431 ] | ||||||||||||||||||||||||||
개요
구조
관련자료utf-8 체크
utf-8 인코딩 체크 예제
package util; import java.io.UnsupportedEncodingException; /** * <pre> * 작성자 : 이종희 (qola@naver.com) * JAlbum.com (http://jalbum.net/download.jsp?ref=list) 소스 참고함. * <b>특정 문자열이 utf-8 인코딩인지 아닌지 체크한다.</b> * * utf-8 인코딩 패턴인 110xxxxx 10xxxxxx , 1110xxxx 10xxxxxx 10xxxxxx 인지 비교한다. * 2바이트 (110xxxxx 10xxxxxx) 패턴의 유니 코드 중복으로 인해 100% 검증할수 없지만 * 한글의 경우 3byte 로 표기 되므로 2바이트 패턴일 경우 utf-8 인코딩이 아닌것으로 간주한다. * * 따라서 000080 ~0007FF 영역의 라틴 문자, 그리스 문자, 키릴 문자, 콥트 문자, * 아르메니아 문자, 히브리 문자, 아랍 문자 등은 utf-8 인코딩을 비교할수 없다. * * 수정된 utf-8의 의한 null값 \u0000 은 11000000 10000000 로 표기되지만 무시하기로 한다. * * </pre> */ public class UTFUtil { public static boolean isUTF8(String str) throws Exception{ byte[] bytes=str.getBytes("ISO-8859-1"); return isUTF8(bytes,0,bytes.length); } public static boolean isUTF8(byte[] buf, int offset, int length) { boolean yesItIs = false; for (int i=offset; i<offset+length; i++) { if ((buf[i] & 0xC0) == 0xC0) { // 11xxxxxx 패턴 인지 체크 int nBytes; for (nBytes=2; nBytes<8; nBytes++) { int mask = 1 << (7-nBytes); if ((buf[i] & mask) == 0) break; } //CJK영역이나 아스키 영역의 경우 110xxxxx 10xxxxxx 패턴으로 올수 없다. if(nBytes==2) return false; // Check that the following bytes begin with 0b10xxxxxx for (int j=1; j<nBytes; j++) { if (i+j >= length || (buf[i+j] & 0xC0) != 0x80) return false; } if(nBytes==3){ // 유니코드 형태로 역치환 해서 0x0800 ~ 0xFFFF 사이의 영역인지 체크한다. char c = (char) (((buf[i] & 0x0f) << 12) + ((buf[i+1] & 0x3F) << 6) + (buf[i+2] & 0x3F)); if(!(c >= 0x0800 && c <= 0xFFFF)){ return false; } } yesItIs = true; } } return yesItIs; } }
한글 URL 사용시 문제 발생 케이스
해결책
구현 예제
|