メニュー
Infomation
■お知らせ
[スパム対策]コメントにURLを含めると自動的に削除されます。
■このサイトについて
一応残していますが、全時代の遺物。全ての情報は古く役に立ちません 連絡先:メールアドレス
■日記更新情報
RSSRSS|RSS(本文のみ)|lirs
実験&リサーチ
巡回先
製作環境
 

 



2004|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|11|12|
2011|01|
2014|05|08|
2017|07|
2018|03|

2010年03月04日(Thursday) [長年日記]

_ [日記][コンピュータ] URLエンコードをデコードするCコード

URLエンコード(Percent-Encoding)をデコードする方法は単純な処理なので実装するのは簡単なのですが、いざ欲しいと思うと何故かOSには用意されていなかったりします。


ググれば一発だろ! と思っても何故かすんなりは見つからないか、見つかっても冗長だったりするので毎回新たに書いているのですが、今回で最後にしたいのでここに貼りつけておきます。

エンコードは今回必要無かったので作ってませんが必要になった時に作ります。

urlDecode()にバッファとその長さと変換したい文字列を渡します。

なんか見本で見かけるソースよりやけに短くなってしまうのですが、何か自分が間違っているんだろうか・・・。(RFCは読んでいない)

     9 :int valueFromHexChar(char hex)
    10 :{
    11 :	if('0' <= hex && hex <= '9') return hex - '0';
    12 :	else if('A' <= hex && hex <= 'F') return hex - 'A' +10;
    13 :	else if('a' <= hex && hex <= 'f') return hex - 'a' +10;
    14 :	else return 0;
    15 :}
    16 :
    17 ://typedef unsigned int size_t;
    18 :void urlDecode(char* decoded 
    19 :			   ,size_t decoded_length
    20 :			   ,const char* source)
    21 :{
    22 :	decoded_length--;	//最後の\0の分
    23 :	while(*source && decoded_length){
    24 :		if(*source == '%'){
    25 :			if(*(source+1) == '\0') break; //%の後2Byte続かずに備えて
    26 :			*(decoded++) 
    27 :				= (valueFromHexChar( *(source+1) ) <<4 )
    28 :				+ valueFromHexChar( *(source+2) );
    29 :			source += 3;
    30 :		}else if(*source == '+'){
    31 :			*(decoded++) = ' ';
    32 :			source++;
    33 :		}else{
    34 :			*(decoded++) = *(source++);
    35 :		}
    36 :		decoded_length--;
    37 :	}
    38 :	*decoded = '\0';
    39 :}

最近のコメント

364,000 at 2008.06.14
Copyright (c) Suika KNOnline.NET