Microsoft MVP성태의 닷넷 이야기
.NET Framework: 54.4. [관련 문제] A 태그의 href에서의 문제. [링크 복사], [링크+제목 복사],
조회: 20244
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 
부모글 보이기/감추기
(연관된 글이 1개 있습니다.)
보통 a 태그의 href에 경로를 줄 때 한글에 대한 처리를 위해서 서버 측에서 다음과 같이 뿌려주게 됩니다.

Server.UrlEncode("액션 쭈꾸미2")

UTF-8인 경우, 다음과 같이 인코딩됩니다.



그래서, a 태그에는 다음과 같이 들어갑니다.

<a href="test.aspx?mode=%ec%95%a1%ec%85%98+%ec%ad%88%ea%be%b8%eb%af%b82" ....

여기까지는 별 문제가 없습니다. 링크를 클릭하면 정상적으로 서버에서는 mode 값에 "액션 쭈꾸미2"가 들어오게 됩니다.

문제는... 위의 네비게이션을 자바 스크립트를 통해 window.open을 하는 경우에 발생합니다. 즉,
<a href="testFunc('%ec%95%a1%ec%85%98+%ec%ad%88%ea%be%b8%eb%af%b82')" ...
와 같이 하고 testFunc을 아래와 같이 구성하는 경우,

function testFunc( testVar )
{
window.open( "test.aspx?mode=" + testVar, null, ... );
}

이렇게 하면... 서버측에서는 다음과 같이 요청을 받게 됩니다.


간단히 말해서... 다음과 같이 mode 값이 깨져서 나오게 됩니다.



일단, 이 문제는 javascript에서 제공되는 escape 함수를 이용해서 해결할 수는 있습니다. 서버측에서 UrlEncode를 하지 않고 그냥 a.href에 한글을 출력시키고 testFunc 안에서는 다음과 같이 esacpe를 이용해서 값을 전달하는 것입니다.

function testFunc( testVar )
{
// testVar == "액션 쭈꾸미2"
window.open( "test.aspx?mode=" + escapse( testVar ), null, ... );
}

일단,,, 여기까지는 임시적인 해결책이라 보고... 도대체 어디서 문제가 발생하는 것인지 파악해봐야 할 필요가 있었습니다.

과연 IE가 잘못 보내는 것일까? 아니면 A 태그 자체가 해석을 잘못하고 있는 것일까? COM 개체로 해당 A 태그의 IDispatch를 받아서 href 값을 구하는 식으로 해서 메모리에 해당 문자열이 어떻게 저장되어 있는지 알아봐야 겠다고 생각했고... 결국 아래와 같이 비정상적으로 값이 구성된 것을 알 수 있었습니다.



원래 %ec%95%a1 3byte가 "액"을 나타내어야 하는 반면, A 태그의 href BSTR 값에는 위에서 보는 바와 같이 00 ec 00 95 00 a1과 같이 총 6byte로 구성하고 있는 것입니다.

당연히 서버측에서는 잘못 해석할 수밖에 없는 것이고요. A 태그에서의 href 값 해석이 비정상적으로 되는 것이죠. UTF-8 등의 별도 인코딩에 대한 배려가 A 태그의 javascript까지는 미치지 못했던 것입니다.

href의 해석에 문제가 있는 것이니... 다음과 같은 표현은 정상적으로 인코딩된 값을 전달해 줍니다.

&a onclick="testFunc('%ec%95%a1%ec%85%98+%ec%ad%88%ea%be%b8%eb%af%b82')" ...

즉, href 이외의 방법이라면 가능한 것이죠. 어쨌든... 이 부분은 근본적으로 MS 측에서의 수정이 이뤄져야 할 것입니다.
[연관 글]






[최초 등록일: ]
[최종 수정일: 6/27/2021]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 




... [166]  167  168  169  170  171  172  173  174  175  176  177  178  179  180  ...
NoWriterDateCnt.TitleFile(s)
891정성태7/8/201024894오류 유형: 97. MsiGetProductInfo failed to retrieve ProductVersion for package with Product Code = '{...}'. Error code: 1605. [2]
889정성태7/5/201026583.NET Framework: 179. Dictionary.Get(A) 대신 Dictionary.Get(A.GetHashCode())를 사용해서는 안 되는 이유 [1]
888정성태6/30/201024380오류 유형: 96. Hyper-V 연결 오류 - A connection will not be made because credentials may not be sent to the remote computer
887정성태6/23/201034240개발 환경 구성: 79. Hyper-V의 가상 머신에서 소리 재생 방법 [2]
886정성태6/23/201022431제니퍼 .NET: 14. ASMX, WCF 호출 모니터링 및 누수 확인
885정성태6/20/201023964개발 환경 구성: 78. COM+ 서버에서 COM+ 서버를 호출하는 방법
884정성태6/20/201026927제니퍼 .NET: 13. COM+ 서버 모니터링 [2]
883정성태6/18/201028818개발 환경 구성: 77. Appinit_Dlls로 구현한 환경 변수 설정 DLL [5]파일 다운로드1
882정성태6/17/201031638개발 환경 구성: 76. JKS(Java Key Store)에 저장된 인증서를 ActiveX 코드 서명에 사용하는 방법 [1]
881정성태6/14/201021055제니퍼 .NET: 12. COM+ 호출 모니터링 및 누수 확인
879정성태6/10/201023716제니퍼 .NET: 11. 소켓 모니터링 기능으로 본 ASP.NET의 소켓 풀링 기능 [1]
878정성태6/6/201023517제니퍼 .NET: 10. 소켓 모니터링 기능으로 본 WCF의 WSDualHttpBinding 성능 부하
877정성태5/31/201020247제니퍼 .NET: 9. 성능 관리 퀴즈 세 번째 문제 (닷넷 개발자 컨퍼런스)
876정성태5/31/201019693제니퍼 .NET: 8. 성능 관리 퀴즈 두 번째 문제 (닷넷 개발자 컨퍼런스) [2]
875정성태5/30/201021434제니퍼 .NET: 7. 성능 관리 퀴즈 첫 번째 문제 (닷넷 개발자 컨퍼런스)
873정성태5/19/201028292제니퍼 .NET: 6. 제니퍼를 위한 방화벽 설정
872정성태5/15/201027617제니퍼 .NET: 5. 제니퍼 서버 - NT 서비스로 구동시키는 방법
871정성태5/13/201034198VC++: 40. MSBuild를 이용한 VC++ 프로젝트 빌드파일 다운로드1
870정성태5/12/201025222제니퍼 .NET: 4. 닷넷 APM 솔루션 - 제니퍼 닷넷의 기능 요약 [2]
869정성태11/8/201926681오류 유형 : 95. WCF 인증서 설정 관련 오류 정리 [4]
865정성태5/5/201028978개발 환경 구성: 75. 인증서의 개인키를 담은 물리 파일 위치 알아내는 방법파일 다운로드1
864정성태5/4/201032838.NET Framework: 178. WCF - 사용자 정의 인증 구현 예제 [4]파일 다운로드1
863정성태5/4/201058750개발 환경 구성: 74. 인증서 관련(CER, PVK, SPC, PFX) 파일 만드는 방법 [1]파일 다운로드1
862정성태5/3/201020620제니퍼 .NET: 3. 제2회 닷넷 개발자 컨퍼런스에서 뵙겠습니다. ^^
861정성태5/1/201021234.NET Framework: 177. .NET 2.0 Profiler에 .NET 4.0 지원 추가
860정성태4/30/201026312오류 유형: 95. .NET 4.0 설치 오류 - 0x800c0005 [1]
... [166]  167  168  169  170  171  172  173  174  175  176  177  178  179  180  ...