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