HTMLのフォームからGETやPOSTで送られてくる文字列は、URLエンコードされてくるので、デコードして元の形に戻すプログラムです。
( こちらのページを参考にしました。)
引数で渡された文字列から、以下の変換を行った文字列を返します。
- [+] → [ ](半角スペース)
- [%○○](○は16進数) → 2桁の16進数の文字
- [%0A][%0D%0A](改行コード) →<br>
#include <iostream> #include <string> #include <ctype.h> // toupper //! %XXのXXをchar型にして返します。 char hexToChar( char first, char second ) { int digit; digit = ( first >= 'A' ? (( first & 0xDF ) - 'A') + 10 : ( first - '0' )); digit *= 16; digit += ( second >= 'A' ? (( second & 0xDF ) - 'A' ) + 10 : ( second - '0' )); return static_cast< char >( digit ); } //! 改行コードか判定します。 bool isLF( const std::string & str, const std::string::size_type & length, std::string::size_type & index, char * tmpStr ) { if ( tmpStr[ 0 ] != '0' ) return false; tmpStr[ 1 ] = toupper( tmpStr[ 1 ] ); if ( tmpStr[ 1 ] == 'A' ) { // [0A]は改行コード return true; } if ( tmpStr[ 1 ] == 'D' ) { // [0D]も改行コード if (( index + 3 ) < length && str[ index + 1 ] == '%' ) { // [0D]の後に[%0A]がある時は、[%0A]の後までインデックスを進めます。 tmpStr[ 0 ] = str[ index + 2 ]; tmpStr[ 1 ] = str[ index + 3 ]; if ( tmpStr[ 0 ] == '0' && ( tmpStr[ 1 ] == 'A' || tmpStr[ 1 ] == 'a' )) { index += 3; } } return true; } return false; } /** URLデコードをした文字列を返します。 改行コード(0x0A, 0x0D)は'\n'にします。 **/ std::string UrlDecorde( const std::string & str ) { std::string retStr; char tmpStr[ 2 ]; std::string::size_type length = str.size(); for ( std::string::size_type i = 0 ; i < length ; i++ ) { if ( str[ i ] == '+' ) { // [+]は半角スペース retStr += ' '; } else if ( str[ i ] == '%' && ( i + 2 ) < length ) { tmpStr[ 0 ] = str[ i + 1 ]; tmpStr[ 1 ] = str[ i + 2 ]; if ( std::isxdigit( tmpStr[ 0 ] ) && std::isxdigit( tmpStr[ 1 ] )) { i += 2; // 改行コードのチェック if ( isLF( str, length, i, tmpStr )) { retStr += "<br>"; } else { retStr += hexToChar( tmpStr[ 0 ], tmpStr[ 1 ] ); } } else { // no digit retStr += '%'; } } else { retStr += str[ i ]; } } return retStr; } int main() { std::cout << UrlDecorde( "%E3%81%82%E3%81%84%E3%81%86%E3%81%88%E3%81%8A%0D%0A%E3%81%8B%E3%81%8D%E3%81%8F%E3%81%91%E3%81%93" ) << std::endl; return 0; }
0 コメント:
コメントを投稿