C++Builder 2009のTIdHTTP::Getの文字コードの処理を検証した

C++Builder 2009のTIdHTTP::Get(URL)はUnicodeStringを返すようになりました。

もしかして、文字コードを自動認識してくれるかも。
と期待して、動作を検証してみたところ、

//UTF-8のページを読み込む
Memo1->Lines->Text = IdHTTP1->Get("http://www.yahoo.co.jp/");

しっかりと、文字化けしました。

自分で文字コードを設定しなければならないようです。

//UTF-8のページを読み込む
std::unique_ptr<TMemoryStream> ms(new TMemoryStream());
IdHTTP1->Get("http://www.yahoo.co.jp/", ms.get());
ms->Position = 0;
Memo1->Lines->LoadFromStream(ms.get(), TEncoding::UTF8);

文字列で取得する場合。

// UTF-8のページを読み込む
std::unique_ptr<TMemoryStream> ms(new TMemoryStream());
IdHTTP1->Get("http://www.yahoo.co.jp/", ms.get());
UTF8String s = reinterpret_cast<char*>(ms->Memory);
//文字コードがShift_JISの場合
//AnsiStringT<932> s = reinterpret_cast<char*>(ms->Memory);
//文字コードがEUC_JPの場合
//AnsiStringT<20932> s = reinterpret_cast<char*>(ms->Memory);

UnicodeStringになって、面倒になったような気がします。

2011年4月13日追記

文字コードの変換には、IndyのReadStringFromStream関数を使って変換することもできます。

//文字コードがUTF-8の場合
UnicodeString s = ReadStringFromStream(ms.get(), ms->Size, TEncoding::UTF8);

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください