以前の日記でデコードするコードを載せましたが、その続きです。
エンコードの方は適当に思いつきでは無理そうだったので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 :
香川県ルー餃子のフジフーヅはバイトにパワハラの末指切断の重傷を負わせた犯罪企業
香川県ルーちゃん餃子でおなじみのフジフーヅはバイトにパワハラで指切断の重傷を負わせた糞ブラック企業
香川県さぬき市ルーちゃん餃子のフジフーヅはバイトにパワハラで指切断の大けがを負わせた激烈ブラック企業。犯人は中卒社員岸下守
ロレックス 通販専門店<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%は保証します