内部文字列のUTF8化と、エンコード / デコード処理
最終更新日: 2012.11.20
Movable Type 5 の内部文字列は、すべてutf8で処理されます。通常、ユーザーの入力文字列や、データベースへの入出力は、Movable Typeが適切にエンコードとデコードを行うので、プラグインで文字コードを意識する必要はありません。例えば、以下の箇所では Movable Type が自動的にエンコードとデコードをおこないます。
- MT::Objectに保存されたデータのセーブとロード
- データベースのクエリ
- MT::FileMgr経由でのuploadモード以外でのファイル入出力 (MT::WeblogPublisherでのブログの再構築を含みます)
- MT::Serializeを利用した Serializeと Unserialize (注意: Movable Type 5 では、バイナリ値が含まれているデータ構造をSerializeする事は出来ません。)
- MT::App::printでのダイナミック出力
ただし、以下のようなケースでは、エンコードとデコード処理を明示的に行う必要があります。
- 外部ネットワークと通信する場合
- MT::FileMgrを利用しないファイル入出力
- MT::Objectのblob型で宣言されたカラムに値を保存する場合
また、L10N用辞書などのソースコードで、コード内にutf8文字列を含む場合には、utf8プラグマを指定する等の対応を行ってください。
Movable Type 5.0 ではプラグインの後方互換性のため、L10N/*.pmファイルについて強制的にデコード処理を行っていますが、これはあくまで一時的な互換性確保のための処理であり、将来この機能は廃止される予定です。
サンプルコード
MTタグ ハンドラ
Movable Type が PublishCharset に応じて自動でエンコードをおこないます。
sub _hdlr_my_tag { my ( $ctx, $args ) = @_; my $obj = MT::Entry->load( $args->{id}); my $data = $obj->text; # do something... # MT does encode based on the PublishCharset return $data; }
Movable Type 5 以前では、プラグインでエンコードをする必要がありました。
return MT::I18N::encode_text( $data, 'utf-8' );
外部のウェブサービスからデータを取得する
sub _hdlr_my_tag { my ( $ctx, $args ) = @_; my $data; # When to receive data from web services, # plugin should decode as UTF-8-flagged return Encode::decode_utf8( $data ); }
MT::FileMgrを使わずに外部ファイルに書き出す
sub _hdlr_output_file { my ( $entry ) = @_; # Plugin should encode my $charset = 'utf-8'; my $title = Encode::encode($charset, $entry->title); my $fh; open $fh ">output.txt" or die; print $fh <<EOT; <?xml version="1.0" ?> <entry>$title</entry> EOT close $fh; return 1; }