メニュー
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件) [コメントを投稿]
§ 名無しのリーク (2016年07月16日(Saturday) 17:58)

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

§ 名無しのリーク (2016年07月25日(Monday) 12:32)

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

§ 名無しのリーク (2017年07月04日(Tuesday) 07:40)

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

§ バッグ・財布・時計スーパーコピーブランドコピー (2018年09月29日(Saturday) 05:49)

ロレックス 通販専門店<br><br>★経営理念: <br>1.信用第一,品質保証,最も合理的な価格で商品を消費者に提供致します. <br>2.弊社の商品品数大目で、商品は安めです!★商品現物写真★ <br>3.数量制限無し、一個の注文も、OKです. <br>4.1個も1万個も問わず、誠心誠意対応します. <br>5.不良品の場合、弊社が無償で交換します.<br><br><br>営業種目:<br>高級腕時計,スーパーコピー時計(N級品),財布(N級品)<br>バッグ(N級品),靴(N品),指輪(N級品),ベルト(N級品),マフラー(N級品)<br>ロレックス,カルティエ,IWC,オメガ,パネライ,ブランド時計等も豊富に取り揃えております<br><br>価格が特恵を与えて、信用の第1、品質の100%は保証します


最近のコメント

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