C++Builder XE5でTIdURI::URLEncodeでURLをエンコード/デコードする

Delphi XE5/C++Builder XE5では、TIdURI::URLEncode関数とTIdURI::URLDecode関数の引数が変更されていたので、「URLをエンコード・デコードする」のエントリーを更新した。

TEncodingの代わりにIIdTextEncodingを引数にとるように変更されている。

IIdTextEncodingのインスタンスを取得するには、IdGlobalユニットで定義されている次の関数を使用する。

function IndyTextEncoding_Default: IIdTextEncoding;
function IndyTextEncoding_OSDefault: IIdTextEncoding;
function IndyTextEncoding_8Bit: IIdTextEncoding;
function IndyTextEncoding_ASCII: IIdTextEncoding;
function IndyTextEncoding_UTF16BE: IIdTextEncoding;
function IndyTextEncoding_UTF16LE: IIdTextEncoding;
function IndyTextEncoding_UTF7: IIdTextEncoding;
function IndyTextEncoding_UTF8: IIdTextEncoding;

コードページや文字コード名で取得するときは次の関数を使用する。

function IndyTextEncoding(ACodepage: Word): IIdTextEncoding; overload;
function IndyTextEncoding(const ACharSet: String): IIdTextEncoding; overload;

###C++Builder XE5を使って、文字コードUTF8でURLをエンコードする

#include <IdURI.hpp>

UnicodeString uri = TIdURI::URLEncode(
  "http://www.example.com/こんにちは、世界",
  IndyTextEncoding_UTF8());
//=> uri = http://www.example.com/%E3%81%93%E3%82%93%E3%81%AB%E3%81%A1%E3%81%AF%E3%80%81%E4%B8%96%E7%95%8C

###C++Builder XE5を使って、文字コードShift_JISでURLをエンコードする

Shift_JISのコードページは932だからIndyTextEncoding関数の引数に932を渡す。

#include <IdURI.hpp>

UnicodeString uri = TIdURI::URLEncode(
  "http://www.example.com/こんにちは、世界",
  IndyTextEncoding(932));
//=> uri = http://www.example.com/%82%B1%82%F1%82%C9%82%BF%82%CD%81%41%90%A2%8A%45

###C++Builder XE5を使って、文字コードUTF8でURLをデコードする

#include <IdURI.hpp>

UnicodeString uri = TIdURI::URLDecode(
  "http://www.example.com/%E3%81%93%E3%82%93%E3%81%AB%E3%81%A1%E3%81%AF%E3%80%81%E4%B8%96%E7%95%8C",
  IndyTextEncoding_UTF8());
//=> uri = http://www.example.com/こんにちは、世界

###C++Builder XE5を使って、文字コードShift_JISでURLをデコードする

Shift_JISのコードページは932だからIndyTextEncoding関数の引数に932を渡す。

#include <IdURI.hpp>

UnicodeString uri = TIdURI::URLDecode(
  "http://www.example.com/%82%B1%82%F1%82%C9%82%BF%82%CD%81%41%90%A2%8A%45",
  IndyTextEncoding(932));
//=> uri = http://www.example.com/こんにちは、世界

コメント

  1. > … 引数が変更されていたので、…
    よくおぼえていないのですが、TIdURI.ParamsEncode のほうはどうですか?

  2. 高橋さん

    Indyのソースを見ると以下のようになっています。
    —–
    XE5 (Indy 10.6.0.5040)
    class function ParamsEncode(const ASrc: string; AByteEncoding: IIdTextEncoding = nil {$IFDEF STRING_IS_ANSI}; ASrcEncoding: IIdTextEncoding = nil{$ENDIF}): string;

    —–
    XE4 (Indy 10.5.8.3)
    class function ParamsEncode(const ASrc: string; AByteEncoding: TIdTextEncoding = nil): string;

    —–
    XE4以前のバージョンのIndyと比較したい場合は、IndyのSVNのソースを見ることである程度は分かるかもしれません。

  3. 「XE4 (Indy 10.5.8.3)」
    と書きましたが、これはXE2をインストールしてからXE4にアップデートした場合かもしれません。

    IndyのSVNを見ると、XE4 RTMには10.6.0がタグ付されているようでした。

コメントを残す

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

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