VCLでCGIにチャレンジしてみた
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->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を作って見る程度なら簡単にあっという間にできちゃうけど、サンプル以上の物を作ろうと思うと、結構自分で書かないとならない。
本当にこんな事が必要なのかな?大丈夫かな?なんか心配だな。
| 固定リンク
「パソコン・インターネット」カテゴリの記事
- httpsになったらレイアウトが崩れたりスクリプトが動かなかったりを修正(2023.06.19)
- AdSense サイト運営者向けポリシー違反レポート(2018.06.05)
- Raspberry pi 3を使ってみた(2016.08.22)
- チープ過ぎるマルチモニター(2015.07.06)
- 効果的なデフラグを考えてみた(2015.02.26)
「C/C++」カテゴリの記事
- コンピュータプログラミング言語調節可能おしゃれキャップ(2018.06.05)
- raspberry piでC++11を使えるようにする(2016.04.27)
- StrinToIntのような文字列を整数に変換する関数を実装してみる(2016.03.21)
- インライン化できない関数のラッパー関数などで関数呼び出しのオーバーヘッドを減らしたい(2016.03.03)
- C++ Builder/Delphiでフォーカスが別のコントロールにある時に強引にTEditに入力を戻す(2014.09.15)
「CBuilder」カテゴリの記事
- 一定時間アイドル状態が続いたら何かをしたい(2015.11.26)
- TMetafileへの描画が反映されない(2015.07.30)
- TDataModuleはClientHeightプロパティを持っていない(2015.02.19)
- VCLのTStringsを検索キーワードのトークナイザー的に使ってみる(2014.12.18)
- Delphi/C++Builder TControl::ClientToScreenでVCLコントロール上の座標をスクリーン座標に変換する(2014.12.02)
「ネットワーク」カテゴリの記事
- YAMAHAの古いルーターRT57iをHUB兼PPTPサーバーとして活用する(2017.03.17)
- ノートパソコンの無線LANが切れる(2014.05.20)
- VCLでCGIにチャレンジしてみた(2013.10.26)
この記事へのコメントは終了しました。
コメント