일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 어학연수
- ue5
- spring message converters
- 유학
- AT&T
- JPA
- 필라델피아
- spring security
- 주식
- 증시
- 학생비자
- weblogic
- rollbackOnly
- 삼성 플렉스북
- mastering unreal engine
- jdk17
- java
- UE4
- kospi
- spring
- 펜실베이니아
- 월화수목금토익
- 인물
- 금융공학
- 최근증시
- @JsonView
- flex하는게 아니었는데..
- paper2d
- mysql
- HRD
- Today
- Total
HeBhy, since 1983.
java(jsp) 에서 바이트단위로 문자열 자르기(한글깨짐없이) 본문
- 더 많은 사이트가 EUC-KR이 아닌 UTF-8 로 바뀌길 바랍니다.
java에서 바이트단위(한글을 2바이트로계산)로 문자열을 한글깨짐없이 자르는 함수입니다.
기존 알고리즘에서 단순하게 MS949로만 처리하였을경우 '뷁' 같은건 되는데 '햏'의 뒷부분 & 0x80이 1이 아니더군요.. 그래서 제대로 잘리지 않더라는..
그래서 UTF-8로 해 보았는데 정확히 인식한다는 장점이 있으나 UTF-8로 하는 순간 한글1자가 3바이트로 되는 골치아픔때문에 소스가 약간 번거로워 졌습니다.^^; 하지만 테스트 결과 그래도 정확히 잘려지니 만족은 합니다.^^;
함수 사용은
strCut(대상문자열, 시작위치로할키워드, 자를길이, 키워드위치에서얼마나이전길이만큼포함할것인가, 태그를없앨것인가, 긴문자일경우"..."을추가할것인가)
처럼 하시면 되겠습니다.
[예]
"가나다라" 에서 2바이트까지 자르고 싶을경우 strCut("가나다라", null, 2, 0, true, true); 처럼 하시면 됩니다.
=> 결과 : "가"
"가나다라" 에서 "다"라는 키워드 기준에서 2바이트까지 자르고싶을경우 strCut("가나다라", "다", 2, 0, true, true); 처럼 하시면 됩니다.
=> 결과 : "다"
"가나다라" 에서 "라"라는 키워드 기준으로 그 이전의 4바이트까지 포함하여 6바이트까지 자르고 싶을 경우 strCut("가나다라", "라", 6, 4, true, true); 처럼 하시면 됩니다.
=> 결과 : "나다라"
"가나다라" 에서 3바이트를 자를 경우
=> 결과 : "가"
"가a나다라" 에서 3바이트를 자를 경우
=> 결과 : "가a"
"가나다라" 에서 "나" 키워드 기준으로 이전 1바이트 포함하여 4바이트까지 자를 경우
=> 결과 : "나"
소스는 아래와 같습니다. 도움되시길.. 모두 즐프하세요 ^^
public String strCut(String szText, String szKey, int nLength, int nPrev, boolean isNotag, boolean isAdddot){ // 문자열 자르기 String r_val = szText; int oF = 0, oL = 0, rF = 0, rL = 0; int nLengthPrev = 0; Pattern p = Pattern.compile("<(/?)([^<>]*)?>", Pattern.CASE_INSENSITIVE); // 태그제거 패턴 if(isNotag) {r_val = p.matcher(r_val).replaceAll("");} // 태그 제거 r_val = r_val.replaceAll("&", "&"); r_val = r_val.replaceAll("(!/|\r|\n| )", ""); // 공백제거 try { byte[] bytes = r_val.getBytes("UTF-8"); // 바이트로 보관 if(szKey != null && !szKey.equals("")) { nLengthPrev = (r_val.indexOf(szKey) == -1)? 0: r_val.indexOf(szKey); // 일단 위치찾고 nLengthPrev = r_val.substring(0, nLengthPrev).getBytes("MS949").length; // 위치까지길이를 byte로 다시 구한다 nLengthPrev = (nLengthPrev-nPrev >= 0)? nLengthPrev-nPrev:0; // 좀 앞부분부터 가져오도록한다. } // x부터 y길이만큼 잘라낸다. 한글안깨지게. int j = 0; if(nLengthPrev > 0) while(j < bytes.length) { if((bytes[j] & 0x80) != 0) { oF+=2; rF+=3; if(oF+2 > nLengthPrev) {break;} j+=3; } else {if(oF+1 > nLengthPrev) {break;} ++oF; ++rF; ++j;} } j = rF; while(j < bytes.length) { if((bytes[j] & 0x80) != 0) { if(oL+2 > nLength) {break;} oL+=2; rL+=3; j+=3; } else {if(oL+1 > nLength) {break;} ++oL; ++rL; ++j;} } r_val = new String(bytes, rF, rL, "UTF-8"); // charset 옵션 if(isAdddot && rF+rL+3 <= bytes.length) {r_val+="...";} // ...을 붙일지말지 옵션 } catch(UnsupportedEncodingException e){ e.printStackTrace(); } return r_val; }
'Dev > Web' 카테고리의 다른 글
Weblogic 10.3 & Mysql 에서 JDBC Connection Pool (0) | 2009.05.31 |
---|---|
Apache 2.x & Weblogic 10.3 연동 (0) | 2009.05.17 |
BEA Weblogic 10.3 / Oracle DB 11g 교체 (0) | 2009.05.17 |
Java Beans (0) | 2008.11.12 |
jsp에서 java.net.URL로 xml 로딩시 utf-8 한글인코딩 깨짐 문제- 해결법 (2) | 2008.03.04 |