Delphi、C++BuilderではiPhone, Androidアプリ作成の話題で持ちきりですが、C++ Builder 2010でWebBrokerのWebサーバーアプリケーションプロジェクトでCGIを作らなければならなくなったので、やってみたのですが、わからない事だらけだしヘルプには記載がない物ばかりだし。
まず、デフォルトの文字コードがShift_JISなのかな?UTF-8にしたかったのですが、Response->ContentにUTF8String型の文字列を渡してやってもダメなんですね。
Response->ContentType=”text/html; charset=utf-8”;
ってしてやる必要があります。で、
Response->Content = UTF8String(PageProducer1->Content());
でUTF-8で出力する事ができるようになったのですが、HTMLのFORMから投げられる文字列の文字コードがUTF-8だと、取得がうまくいかない文字があるようです。組み合わせによってみたいです。
動的ページをブックマークしたり、リンクを作ったりしたいので、データはGETで渡します。
内部でAnsiStringで処理してるみたいですが…。
とにかく、
String title = Request->QueryFields->Value[“title”];
では文字化けしたりして取得できず、色々と試したのですが、どうもうまく取得できませんでした。
わからないので、自分で書く事にしました。
何をどう処理しているのかわからないので、色々と試行錯誤しました。
どうやらRequest->QueryとHTTPAppのHTTPDecodeが使えそうでした。
boost::shared_ptr queries(new TStringList());
queries->Delimiter = ‘&’;
queries->StrictDelimiter = true;
queries->DelimitedText = Request->Query;
としてみたんですが、うまく切り分けてくれませんでした。
どうもRequest->QueryがAnsiStringなのでうまくいっていないようでした。
UnicodeString unicode_query = Request->Query;
queries->DelimitedText = unicode_query;
として、Request->QueryをUnicodeStringに変換してからqueries->DelimitedTextに渡してみたら、ちゃんと切り分けてくれました。
UnicodeStringにしないとうまく切り分けられなかったので、切り分けのためにUnicodeStringにしてありますので、これをデコードするために再度AnsiStringに変換します。
AnsiString avalue = queries->Values[queries->Names[i]];
avalue = HTTPDecode(avalue);
UTF8String utf8_value;
utf8_value.SetLength(avalue.Length());
memcpy(utf8_value.c_str(), avalue.c_str(), avalue.Length());
でクエリを&で切り分けてデコードして、UTF8文字列に変換できたと思います。
あとは、適当にTPageProducerで透過タグの置換をしたりします。
それにしても、簡単にちょっとサンプルCGIを作って見る程度なら簡単にあっという間にできちゃうけど、サンプル以上の物を作ろうと思うと、結構自分で書かないとならない。
本当にこんな事が必要なのかな?大丈夫かな?なんか心配だな。