内部文字列のUTF8化と、エンコード / デコード処理
最終更新日: 2013.10.08
Movable Type 6 はサポートが終了したバージョンです。最新版のマニュアルはこちら を参照して下さい。
Movable Type 6 の内部文字列は、すべて UTF-8 で処理されます。通常、ユーザーの入力文字列や、データベースへの入出力は、Movable Type が適切にエンコードとデコードを行うので、プラグインで文字コードを意識する必要はありません。例えば、以下の箇所では Movable Type が自動的にエンコードとデコードをおこないます。
- MT::Object に保存されたデータのセーブとロード
- データベースのクエリ
- MT::FileMgr 経由での upload モード以外でのファイル入出力 (MT::WeblogPublisher でのブログの再構築を含みます)
- MT::Serialize を利用した Serialize と Unserialize (注意: Movable Type 6 では、バイナリ値が含まれているデータ構造を Serialize する事は出来ません。)
- MT::App::print でのダイナミック出力
ただし、以下のようなケースでは、エンコードとデコード処理を明示的に行う必要があります。
- 外部ネットワークと通信する場合
- MT::FileMgr を利用しないファイル入出力
- MT::Object の blob 型で宣言されたカラムに値を保存する場合
また、L10N 用辞書などのソースコードで、コード内に UTF-8 文字列を含む場合には、UTF-8 プラグマを指定する等の対応を行ってください。
Movable Type 6 ではプラグインの後方互換性のため、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;
}
外部のウェブサービスからデータを取得する
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;
}