桜も咲いていよいよ春ですね。
本年度は語学の習得(英語、中国語、エスペラント)と漢字検定1級取得を目指すつもりです。
あとは人にやさしく、慈善活動にも力を入れて相手の立場にたった活動に心血を注ぐのも目標です。
ところで、iPhoneをつかって横になりながらWebを見たりすると画面が勝手に回転して鬱陶しいという声があることを知りました。
解決策をユーザーの立場にたって真剣に考えた結果、最初から画面を回転しておけば問題が解決するという事に気づきました。
というわけで、早速回転しておきました。
この調子でがんばりたいと思います。よろしくお願いします。
(4月2日追記)
こんな風になってました。
90度回転したままスクロールやコメントの入力も可能でした。
なんだかんだで5年もエイプリルフールネタやってしまいました。
過去のは[長年日記]をクリックすると見れます。

以前の日記でデコードするコードを載せましたが、その続きです。
エンコードの方は適当に思いつきでは無理そうだったので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 :
§ K@i [ユーザーフレンドリーな貴方に花を 私に唄を。]
§ Suika [>K@iさん 返答に困りますが、ありがとうございます。]