以前の日記でデコードするコードを載せましたが、その続きです。
エンコードの方は適当に思いつきでは無理そうだったのでRFCを読んでみました。
参照元はRFC 3986になります。
Percent-Encodingのデコード関数とエンコード関数を作ってあります。
とはいえ、ナナメ読みなのであんまり信頼してもらっては困りますが。
読んで気づいたのですが、"+"の処理はPercent-Encodingの範疇ではないっぽいですね。
ただしapplication/x-www-form-urlencodedではまずスペースを"+"に置き換えます。
というわけでソースから一応外しました。
上記の用にフォームで使う用途によっては残しておいたほうが便利なのでコメントにしただけにしてます。
長くなったのでファイルでも置いてきます。
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 :
§ 名無しのリーク [香川県ルー餃子のフジフーヅはバイトにパワハラの末指切断の重傷を負わせた犯罪企業]
§ 名無しのリーク [香川県ルーちゃん餃子でおなじみのフジフーヅはバイトにパワハラで指切断の重傷を負わせた糞ブラック企業]
§ 名無しのリーク [香川県さぬき市ルーちゃん餃子のフジフーヅはバイトにパワハラで指切断の大けがを負わせた激烈ブラック企業。犯人は中卒社員..]
§ バッグ・財布・時計スーパーコピーブランドコピー [ロレックス 通販専門店 ★経営理念: 1.信用第一,品質保証,最も合理的な価格で商品を消費者に提供致します. ..]