본문 바로가기
IT

Sybase 는 정말 .. 에휴,,, eucksc 한글 charset 인경우

by 바다하늘구름사랑 2022. 3. 17.

모든 프로젝트가 그렇겠지만

한글 전용으로만 사용하는 경우 이런저런 문제가 발생하곤 한다

 

나 같은 경우 jsp css java 등 모든 소스부터 euc-kr 혹은 iso_8859_1 로 변경하고

개발하곤 했다. 속편하니까....

 

근데 한글 전용으로 하면 은근 꺠지는 문자도 많고

한문이나 중문등 표현되지 않는 부분이 많다보니

신경쓰인다

 

게다가 요즘은 대부분 다 UTF-8로 개발을 하다보니

여러 프로젝트를 진행하는 경우 

이클립스 워크스페이스를 따로 두어서 운영하든지 해야 한다.

싫다 ㅡㅡ

 

이번에 진행하는 프로젝트는

Sybase 를 데이타베이스로 사용한다

당연히 charset을 UTF-8로 요청했는데 안된단다.

원래 쓰고 있던거라 eucksc 로 써야 한단다.

이런 ㅡㅡ....

 

그래서 내 프레임에 넣고 돌려보니 당연히 한글이 안된다.

내 프레임은 전부다 UTF-8이다보니 한글 깨짐이야 당연 ~~~~~~~

 

한글은 2바이트고 UTF-8은 3 바이트니 안되는게 당연 ㅡㅡ...

 

그렇다고 워크스페이스를 따로 두고 운영하거나

프레임을 EUC-KR로 변경하면 프레임을 구분하여 운영해야 하니 

이또한 선택사항이 아니다.

 

그래서 생각한게 모든 환경은 UTF-8로 처리하고

실제 DB 처리시만 EUC-KR로 변환해서 처리하도록 하는 것이다

남들 다 그렇게 한다고 ? 몰라.. 그런지..

 

하튼 처리했고

결론은 이거다 .....

 

sqlSessiontemplate를 override 했다.

insert,update,list,view 시

 

 

[-----------------------------------------------------------]

private <T> T check( Object oo){
if (oo == null) {
return (T)oo;
}

if (this.dbctype == null) {
this.dbctype = ImsProperty.getInstance().getProperty("CHARACTER.DB.TYPE");
}

if ("EUC-KR".equals(this.dbctype)) {

if ("java.util.HashMap".equals(oo.getClass().getTypeName())) {

String sval = "";
HashMap<String,Object> o = (HashMap<String,Object>)oo;
for(String key : o.keySet()) {
if (o.get(key) != null && "java.lang.String".equals(o.get(key).getClass().getTypeName())) {
sval = (String)o.get(key);
try {
o.put(key, new String(sval.getBytes("8859_1"),"EUC-KR"));
} catch (UnsupportedEncodingException e) {
}

}

return (T)o;

} else if ("java.lang.String".equals(oo.getClass().getTypeName())) {

String o = (String)oo;
try {
o = new String(o.getBytes("8859_1"),"EUC-KR");
} catch (UnsupportedEncodingException e) {
}
return (T)o;

}
}

return (T)oo;
}

 

위와 같이 (물론 세부사항은 틀리지만, 나머지 미진한 부분은 공부하거나 필요시 요청하시길 )

해서 스트링에 대해 한번더 값을 변경해 주었다

 

핵심은 이거다

insert, update 시에는

r = new String(r.getBytes("EUC_KR"), StandardCharsets.ISO_8859_1 );

와 같이 변경해주고

읽어올떄는 

new String(sval.getBytes("8859_1"),"EUC-KR"))

와 같이 변경해주는 거다.

 

물론.. 속도는 떨어진다....

 

하지만 UTF-8로 모든 환경을 사용하면서

데이타베이스는 EUC-KR로 유지하면서

완전하게 동작하는것에 위안을 삼는다.

 

이건 UTF-8 개발환경에서 어떤 charset으로 DB를 작동하든

다 동작할테니까.....

 

하튼 제발 글로벌하게 DB는 UTF-8로 쓰는걸루 하자... Please....