안규 공부방

ACTIVE SERVER PAGE > URLDecode - UTF-8 문자형식 디코딩 하자.

등록일 : 2017-07-04 18:12 조회수 : 93,777

기존에 사용하던 URLDECODE 함수가

특수문자 또는 한자 , 일부 외국어 등 UTF-8 문자열에서 제대로 DECODE 되지 않는 문제가 있어서

찾아보았더니 문자셋 문제였습니다.

네이버에서 검색해서 들어온 URL 을 확인해 보았다.
http://search.naver.com/search.naver?where=nexearch&query=%EC%97%94%ED%84%B0%EC%86%8C%ED%94%84%ED%8A%B8&sm=top_hty&fbm=1&ie=utf8

아스키문자인 URLDecode 함수를 사용해서 변환해 보았다.

아래는 결과다.

http://search.naver.com/search.naver?where=nexearch&query=???????????????&sm=top_hty&fbm=1&ie=utf8

query= 다음문자가 ??????????????? 와 같이 제대로 디코딩이 안되는 것이다.

원인은 문자셋 UTF-8 로 인코딩 되어 있던 것이다.

UTF-8 로 인코딩된것은 UTF-8 형태로 디코딩이 되어야 한다.

아래는 결과다.

1. http://search.naver.com/search.naver?where=nexearch&query=엔터소프트&sm=top_hty&fbm=1&ie=utf8
2. http://search.naver.com/search.naver?where=nexearch&query=엔터소프트&sm=top_hty&fbm=1&ie=utf8


사용방법은 

URLDecodeUTF8("문자열")
UrlDecode_GBToUtf8("문자열")

하면 된다.

각기 다른 함수가 두개 존재한다..... (결과는 같다)

유용하게 사용하길...
 
	'------------------------------------------------------------------------------------

	Public Function URLDecodeUTF8(byVal pURL)
		 Dim i, s1, s2, s3, u1, u2, result
		 pURL = Replace(pURL,"+"," ")
		
		 '?,%가 없다면 검색할 필요없음
		if instr(1,pURL,"?",1) > 0 OR instr(1,pURL,"%",1) > 0 then
				 For i = 1 to Len(pURL)
					 if Mid(pURL, i, 1) = "%" then
						 s1 = CLng("&H" & Mid(pURL, i + 1, 2))
			
						 '2바이트일 경우
						if ((s1 AND &HC0) = &HC0) AND ((s1 AND &HE0) <> &HE0) then
							 s2 = CLng("&H" & Mid(pURL, i + 4, 2))
			
							 u1 = (s1 AND &H1C) / &H04
							 u2 = ((s1 AND &H03) * &H04 + ((s2 AND &H30) / &H10)) * &H10
							 u2 = u2 + (s2 AND &H0F)
							 result = result & ChrW((u1 * &H100) + u2)
							 i = i + 5
			
						 '3바이트일 경우
						elseif (s1 AND &HE0 = &HE0) then
							 s2 = CLng("&H" & Mid(pURL, i + 4, 2))
							 s3 = CLng("&H" & Mid(pURL, i + 7, 2))
			
							 u1 = ((s1 AND &H0F) * &H10)
							 u1 = u1 + ((s2 AND &H3C) / &H04)
							 u2 = ((s2 AND &H03) * &H04 +  (s3 AND &H30) / &H10) * &H10
							 u2 = u2 + (s3 AND &H0F)
							 result = result & ChrW((u1 * &H100) + u2)
							 i = i + 8
						 end if
					 else
						 result = result & Mid(pURL, i, 1)
					 end if
				 Next
		 else
			 result = ""
		 end if
		 URLDecodeUTF8 = result
	 End Function

	'------------------------------------------------------------------------------------

	 Function UrlDecode_GBToUtf8(ByVal str) 
		Dim B,ub   
		Dim UtfB   
		Dim UtfB1, UtfB2, UtfB3 
		Dim i, n, s 
		n=0 
		ub=0 
		For i = 1 To Len(str) 
			B=Mid(str, i, 1) 
			Select Case B 
				Case "+" 
					s=s & " " 
				Case "%" 
					ub=Mid(str, i + 1, 2) 
					UtfB = CInt("&H" & ub) 
					If UtfB<128 Then 
						i=i+2 
						s=s & ChrW(UtfB) 
					Else 
						UtfB1=(UtfB And &H0F) * &H1000   
						UtfB2=(CInt("&H" & Mid(str, i + 4, 2)) And &H3F) * &H40       
						UtfB3=CInt("&H" & Mid(str, i + 7, 2)) And &H3F       
						s=s & ChrW(UtfB1 Or UtfB2 Or UtfB3) 
						i=i+8 
					End If 
				Case Else   
					s=s & B 
			End Select 
		Next 
		UrlDecode_GBToUtf8 = s 
	End Function 
 
	
 
※ 혹시 도움이 되셨다면 댓글에 한마디 남겨주세요!
작성자   비밀번호
자동글 방지     (자동글 방지 기능입니다.)
내용   댓글달기 
이메일 문의 : cak0280@nate.com  
Copyright 2000 By ENTERSOFT.KR All Rights Reserved.