Serach

2013년 10월 10일 목요일

URL Encoding ( URL 인코딩 )

회사에서 과금 영수증 모듈을 처리하던 도중 ... Signature값을 잘못 전달하는 오류가 발생햇다..

원인은 URL Encoding 처리를 하지 않아서 인데

URL 주소에는 특정 문자들만 포함 할 수 있습니다.( ASCII character-set )
하지만 간혹 ASCII 문자 외의 문자들이 포함이 될 수 있는데( 예를 들면 공백 )
이러한 금지 또는 제한된 문자들을 16진수로 변환하여 URL에 포함하는 것을 URL Encoding 라고 합니다.

쉽게 얘기하면 대소문자, 숫자, 그리고 기타 문자들을 제외한 문자를 16진수로 변환 하는 것 입니다.
기타 문자라고 했는데 정확히 저도 이해를 하지 못하고 있는 부분 입니다.
구글 크롬과 MS IE8 을 기준으로 테스트를 했는데 브라우저 별로 인코딩 되는 문자가 틀리더군요.

크롬에서 그대로 표시되는 문자 목록

~ ` ! $ ^ * ( ) -  _ / < > , . | ; : " ' { } [ ]
★( ㅁ + 한자 + 8 ) 과 같은 특수 문자도 그대로 표현


MS IE8 에서 그대로 표시되는 문자 목록

@ * - _



인코딩 방식에 따라 틀린것 같은데, 아시는 분이 댓글을 달아 주시면 감사하겠습니다.
아무튼, 이러한 문제점 때문에 대소문자와 숫자를 제외하고 
모두 % + 16진수로 변환하는 코드를 작성 합니다.



const char ConvertToHex( const char cSource )
{   
return "0123456789abcdef"[ 0x0f & cSource ];
}

const std::string URLEncoding( const std::string& kInput )
{
std::string kOutput;

std::string::const_iterator string_iter = kInput.begin();
while( string_iter != kInput.end() )
{
const std::string::value_type element = (*string_iter);

if( isascii( element )      // ASCII 문자 이고
&& isalnum( element ) ) // 대소문자, 그리고 숫자
{
kOutput += element;
}
else // 그 외 문자는 모두 %16진수 형태로 변환
{
kOutput += "%";
kOutput += ConvertToHex( element >> 4 );
kOutput += ConvertToHex( element );
}

++string_iter;
}

return kOutput;
}

댓글 없음:

댓글 쓰기