메뉴 건너뛰기

Dev tips

ASP ASP를 이용한 Decode and Encode UTF-8

taknim 2008.10.17 03:20 조회 수 : 9676 추천:2115

<%
option explicit

' Simple functions to convert the first 256 characters
' of the Windows character set from and to UTF-8.

' Written by Hans Kalle for Fisz
' http://www.fisz.nl

'IsValidUTF8
'  Tells if the string is valid UTF-8 encoded
'Returns:
'  true (valid UTF-8)
'  false (invalid UTF-8 or not UTF-8 encoded string)
function IsValidUTF8(s)
  dim i
  dim c
  dim n

  IsValidUTF8 = false
  i = 1
  do while i <= len(s)
    c = asc(mid(s,i,1))
    if c and &H80 then
      n = 1
      do while i + n < len(s)
        if (asc(mid(s,i+n,1)) and &HC0) <> &H80 then
          exit do
        end if
        n = n + 1
      loop
      select case n
      case 1
        exit function
      case 2
        if (c and &HE0) <> &HC0 then
          exit function
        end if
      case 3
        if (c and &HF0) <> &HE0 then
          exit function
        end if
      case 4
        if (c and &HF8) <> &HF0 then
          exit function
        end if
      case else
        exit function
      end select
      i = i + n
    else
      i = i + 1
    end if
  loop
  IsValidUTF8 = true
end function

'DecodeUTF8
'  Decodes a UTF-8 string to the Windows character set
'  Non-convertable characters are replace by an upside
'  down question mark.
'Returns:
'  A Windows string
function DecodeUTF8(s)
  dim i
  dim c
  dim n

  i = 1
  do while i <= len(s)
    c = asc(mid(s,i,1))
    if c and &H80 then
      n = 1
      do while i + n < len(s)
        if (asc(mid(s,i+n,1)) and &HC0) <> &H80 then
          exit do
        end if
        n = n + 1
      loop
      if n = 2 and ((c and &HE0) = &HC0) then
        c = asc(mid(s,i+1,1)) + &H40 * (c and &H01)
      else
        c = 191
      end if
      s = left(s,i-1) + chr(c) + mid(s,i+n)
    end if
    i = i + 1
  loop
  DecodeUTF8 = s
end function

'EncodeUTF8
'  Encodes a Windows string in UTF-8
'Returns:
'  A UTF-8 encoded string
function EncodeUTF8(s)
  dim i
  dim c

  i = 1
  do while i <= len(s)
    c = asc(mid(s,i,1))
    if c >= &H80 then
      s = left(s,i-1) + chr(&HC2 + ((c and &H40) / &H40)) + chr(c and &HBF) + mid(s,i+1)
      i = i + 1
    end if
    i = i + 1
  loop
  EncodeUTF8 = s
end function
%>


To test the functions, one can use the code below. Place this code in a separate file, utf8test.asp for example.

<!--#include file="utf8.asp"-->
<html>
<head>
<title>Test UTF encoding en decoding</title>
<head/>
<body>
<h1>Decoding</h1>
<p>Kopi?ren ok: <%=DecodeUTF8("Kopi큰ren")%></p>
<p>Kopi?ren error: <%=DecodeUTF8("Kopi?ren")%></p>
<p>Kopi?ren error: <%=DecodeUTF8("Kopi흏en")%></p>
<p>Kopi?ren error: <%=DecodeUTF8("Kopi큰쳑en")%></p>
<p>Kopi?ren error: <%=DecodeUTF8("Kopi奭ren")%></p>
<h1>Encoding</h1>
<p>Kopi?ren UTF-8: <%=EncodeUTF8("Kopi?ren")%></p>
<p>Kopi?ren forth & back: <%=DecodeUTF8(EncodeUTF8("Kopi?ren"))%></p>
<h1>Testing encoding</h1>
<p>Kopi?ren: <%=IsValidUTF8("Kopi?ren")%></p>
<p>Kopi큰ren: <%=IsValidUTF8("Kopi큰ren")%></p>
<p>Kopi큰쳑en: <%=IsValidUTF8("Kopi큰쳑en")%></p>
<p>Aeroplane: <%=IsValidUTF8("Aeroplane")%></p>
</body>
</html>
번호 제목 글쓴이 날짜 조회 수
293 Implement Oracle's rownum using mysql taknim 2009.01.08 10786
292 오라클의 rownum 처럼 쓸수 있는 mysql 명령어가 있나요 taknim 2009.01.08 9794
291 PHP5 에서 mysql password, old_password 구현 taknim 2009.01.07 12887
290 Include 파일은 부모 디렉터리를 표시하기 위해 '..'를 사용할 수 없습니다. 와 같은 오류 발생 taknim 2009.01.06 9886
289 MySQL CSV 파일 import taknim 2008.12.30 11759
288 USB 메모리의 파일 시스템 FAT32를 NTFS로 변환하는 방법 taknim 2008.12.23 10187
287 윈도우 XP 한 폴더에 저장할 수 있는 파일의 최대 갯수? taknim 2008.12.23 12205
286 [출처] [TIP] BEEP SOUND 에 따른 에러확인하기....... taknim 2008.12.22 8155
285 윈도우XP 속도를 빠르게 하는 Tip 총정리(21개) taknim 2008.12.21 7346
284 MySQL에서 Sleep 프로세스 죽이기 taknim 2008.12.11 11734
283 [Shell]Mysql processlist 지켜 보기 [1] taknim 2008.12.11 9891
282 dtd 체크하는 스크립트 taknim 2008.12.06 10681
281 echo 와 print / include 와 require taknim 2008.12.03 10681
280 [C/C++] prnitf 역슬래쉬 문자 taknim 2008.11.28 16248
279 PHP 새로 컴파일 없이 추가 모듈 설치 taknim 2008.11.27 11956
278 [mysql] 슈퍼 update taknim 2008.11.25 9369
277 오라클에서 varchar2(4000) 데이타 넣기 taknim 2008.11.25 9624
276 [오라클] 슈퍼 updateoracle taknim 2008.11.25 9913
275 보안을 위한 php.ini 설정 [1] taknim 2008.11.12 9679
274 웹 서버 보안을 위한 php.ini 설정팁 taknim 2008.11.12 9333