Pleasure resort of Gleam™

한자명을 사용함에 있어, 인명용 확장한자일 경우, 예컨대, 朴?俊 (박현준) 과 같이 가운데 글자(빛날 현) 가 확장 한자일 경우, 그냥 입력후 폼을 서브밋하면, 처리페이지에서 에러가 발생하거나 원하는 대로 입력되지 않거나, 또는 입력은 되는데 보여지는 페이지가 charset=euc-kr로 지정되어야만 하는 페이지에서는 ???등으로 엉뚱하게 표시된다.

특히 입력값을 처리하는 곳에서, 덱스트파일업로드가 쓰였을 경우, 덱스트파일업로드 2.0 미만버전에서는 확장한자 등을 인식하지 못하는 것으로 알고 있다.

만약, 아래와 같이, runat="server" 스크립트로, decodeURI,encodeURI와 같이 함수를 사용하여, 유니코드로 변환 저장을 할수는 있지만...

[CODE]<script language="javascript" runat="server"> function uni2str(str){ return decodeURI(str); } function str2uni(str){ return encodeURI(str); } </script>[/CODE]

유니코드로 제대로 입력된다 하더라도, 페이지의 문자셋트가 [CODE]<meta http-equiv="Content-Type" content="text/html; charset=euc-kr">[/CODE]와 같이 지정된 페이지에서는 확장한 한글만 따로 유니코드로 보여줄 수 없으므로, 웹사이트 전체 및 DB에 대한 유니코드 기반의 제작으로 바꾸어 주어야 하는데, 한자이름 단 한개만을 표시하기 위해서, 그런 엄청난 재개발을 한다는 것은 사실상 어렵다고 볼수 있다.

오랜 삽질 끝에, 해결한 방법은 허무하게도 간단하다. 그것은 단순하지만, 기발한 착상이었던 것 같다.
해법은 아스키 코드이다.. 아래의 코드를 보라!

[CODE]<script language="javascript" > //확장한자의 입력,보여주기에서 문제가 없도록 한자명을 아스키코드로 변환해서 돌려주는 함수. //(단, 아스키코드값의 앞에 &을, 뒤에는 ;를 붙여주어서 웹브라우저가 해석할때 아스키코드문자라는 것을 인식하게 한다.) function strToAscii(str){ var conStr=""; for(i=0;i<str.length;i++){ chr = "&"+ str.charCodeAt(i) + ";" ; conStr = conStr + chr ; } //alert(conStr); return conStr; //변환된 아스키 코드 문자열 반환 } </script>[/CODE]

확장한자를 입력하는 페이지의, 입력값 유효성 검사하는 곳에, 위의 함수를 별도로 삽입하고, 해당 한자이름이 위의 변환함수를 거쳐서 서브밋되게 하였다. 그러면, DB의 컬럼을 nvarchar 형으로 굳이 바꿀필요가 없다. (다만 아스키코드로 변환되고, 또 거기에다 글자마다 앞뒤에 &, ; 기호를 각각 붙여주기 때문에 글자한개가 차지하는 자릿수가 ? 과 같이 8글자이상으로 늘어나므로, 한글이름이 최대 5글자라면 자료형은, 한글자당 10바이트로 쳐서, varchar(50) 정도로 잡아주는 것이 필요하다.) 이렇게 되면, 굳이 페이지의 문자세트나, asp에서의 system.CodePage 지정, 파일저장시 유니코드로 저장, db의 유니코드변환
등의 번거롭고 엄청난 작업의 수반없이도, 즉 charset=euc-kr 로 지정된 페이지에서도, 부분적으로 원하는 곳에만 확장한자와 같은 문자들을 용이하게 처리할 수 있게 되는 것이다.

경고:
될수 있으면 유니코드로 사용을 하신다면 UTF-8 인코딩에 NVARCHAR를 사용하시는게 좋습니다. 만약 러시어나 기타 등등 다른 외국어가 오게 되면 또 다른 문제점을 발생할 수 도 있으니 이런것을 감안하셔서 작업하시기 바랍니다 ^^:


From: 뉴스그룹

Comment +0