メニュー
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|
2020|08|10|
2021|11|

2010年04月09日(Friday)

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

以前の日記でデコードするコードを載せましたが、その続きです。

エンコードの方は適当に思いつきでは無理そうだったのでRFCを読んでみました。

参照元はRFC 3986になります。

Percent-Encodingのデコード関数とエンコード関数を作ってあります。

とはいえ、ナナメ読みなのであんまり信頼してもらっては困りますが。


読んで気づいたのですが、"+"の処理はPercent-Encodingの範疇ではないっぽいですね。

ただしapplication/x-www-form-urlencodedではまずスペースを"+"に置き換えます。

というわけでソースから一応外しました。

上記の用にフォームで使う用途によっては残しておいたほうが便利なのでコメントにしただけにしてます。


長くなったのでファイルでも置いてきます。

■percentEncoding.zip

2010/11/11追記

このソースコードのライセンスは「ご自由にお使いください」ライセンスです。

用途を問わず、利用改変自由です。ただし無保証。

よろしければ一言コメント欄にどうぞ。(任意です)

     1 ://///////////////////////////
     2 :///
     3 :///  Percent-Encoding(RFC 3986)
     4 :///
     5 :///  2010.03.08 http://Knonline.NET
     6 :///
     7 :
     8 :
     9 :#include "percentEncoding.h"
    10 :
    11 ://///////////Percent-Encoding/////////////////////////
    12 :
    13 :#define ASCII_ALPHA1_START	(0x41)	//A
    14 :#define ASCII_ALPHA1_END	(0x5A)	//Z
    15 :#define ASCII_ALPHA2_START	(0x61)	//a
    16 :#define ASCII_ALPHA2_END	(0x7A)	//z
    17 :#define ASCII_DIGIT_START	(0x30)	//0
    18 :#define ASCII_DIGIT_END		(0x39)	//9
    19 :#define ASCII_HYPHEN		(0x2D)	//-
    20 :#define ASCII_PERIOD		(0x2E)	//.
    21 :#define ASCII_UNDERSCORE	(0x5F)	//_
    22 :#define ASCII_TILDA			(0x7E)	//~
    23 :
    24 :
    25 :
    26 :
    27 ://16進数文字[A-F|a-f]から数値を得る
    28 :int valueFromHexChar(char hex)
    29 :{
    30 :	if('0' <= hex && hex <= '9') return hex - '0';
    31 :	else if('A' <= hex && hex <= 'F') return hex - 'A' +10;
    32 :	else if('a' <= hex && hex <= 'f') return hex - 'a' +10;
    33 :	else return 0;
    34 :}
    35 :
    36 ://数値[0-15]から16進数文字を得る
    37 :char hexCharFromValue(unsigned int value)
    38 :{
    39 :	if( value <0 || 16 <= value) return '0';
    40 :	return "0123456789ABCDEF"[value];
    41 :}
    42 :
    43 ://URLエンコードをデコードする
    44 :void urlDecode(char* decoded 
    45 :			   ,size_t decoded_length
    46 :			   ,const char* source)
    47 :{
    48 :	decoded_length--;	//最後の\0の分
    49 :	while(*source && decoded_length){
    50 :		if(*source == '%'){
    51 :			if(*(source+1) == '\0') break; //%の後2Byte続かずに
終わっている場合に備えて
    52 :			*(decoded++) 
    53 :				= (valueFromHexChar( *(source+1) ) <<4 )
    54 :				+ valueFromHexChar( *(source+2) );
    55 :			source += 3;
    56 :		}/*else if(*source == '+'){	//おまけ
    57 :			*(decoded++) = ' ';
    58 :			source++;
    59 :		}*/else{
    60 :			*(decoded++) = *(source++);
    61 :		}
    62 :		decoded_length--;
    63 :	}
    64 :	*decoded = '\0';
    65 :}
    66 :
    67 ://URLエンコードにエンコードする
    68 :void urlEncode(char* encoded 
    69 :			   ,size_t encoded_length
    70 :			   ,const char* source)
    71 :{
    72 :	char temp;
    73 :	encoded_length--;
    74 :	while(*source && encoded_length){
    75 :		temp =*source;
    76 :		if(   ASCII_ALPHA1_START <= temp &&  temp<= ASCII_ALPHA1_END
    77 :			||ASCII_ALPHA2_START <= temp &&  temp<= ASCII_ALPHA2_END
    78 :			||ASCII_DIGIT_START <= temp &&  temp<= ASCII_DIGIT_END
    79 :			|| temp == ASCII_HYPHEN
    80 :			|| temp == ASCII_PERIOD
    81 :			|| temp == ASCII_UNDERSCORE
    82 :			|| temp == ASCII_TILDA)
    83 :		{
    84 :			//Unreserved Characters
    85 :			*(encoded++) = temp;
    86 :			
    87 :		}else{
    88 :			//Reserved Characters
    89 :			*(encoded++) = '%';
    90 :			if(!(--encoded_length)) break;
    91 :			*(encoded++) = hexCharFromValue((unsigned char)temp >> 4);
    92 :			if(!(--encoded_length)) break;
    93 :			*(encoded++) = hexCharFromValue(temp & 0x0F);
    94 :			encoded_length-=2;
    95 :		}
    96 :		source++;
    97 :		encoded_length--;
    98 :	}
    99 :	*encoded = '\0';
   100 :}
   101 :
   102 :
本日のコメント(全4件) [コメントを投稿]

§ 名無しのリーク [香川県ルー餃子のフジフーヅはバイトにパワハラの末指切断の重傷を負わせた犯罪企業]

§ 名無しのリーク [香川県ルーちゃん餃子でおなじみのフジフーヅはバイトにパワハラで指切断の重傷を負わせた糞ブラック企業]

§ 名無しのリーク [香川県さぬき市ルーちゃん餃子のフジフーヅはバイトにパワハラで指切断の大けがを負わせた激烈ブラック企業。犯人は中卒社員..]

§ バッグ・財布・時計スーパーコピーブランドコピー [ロレックス 通販専門店 ★経営理念: 1.信用第一,品質保証,最も合理的な価格で商品を消費者に提供致します. ..]


最近のコメント

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