Everything UTF8
In Movable Type 5, all internal character strings are processed with utf8. Usually, MT performs the appropriate Encode/Decode for users' input or database input/output, so there is no need to consider this on the plugin.
MT performs automatic Encode/Decode in the following circumstances:
- When saving/loading data saved to MT::Object.
- Database queries.
- File input/output with MT::FileMgr except for upload mode.( Including blog republishing with MT::WeblogPublisher)
- When running Serialize/unserialize with MT::Serialize.
Note: In MT5, you cannot serialize data construction that includes binary values. - Dynamic output with MT::App::print.
However, in the following cases, you must explicitly process the appropriate Encode/Decode:
- When communicating with an external network.
- File input/output without MT::FileMgr
- When saving values to columns declared in MT::Object blob format.
Also, if utf8 character strings are in L10N dictionary or similar source codes, please specify a utf8 pragma and all other necessary settings. In order to maintain backward plugin compatibility, Movable Type 5.0 runs a compulsory Decode for L10N*.pm files. But this process might be ceased in the future.
Code Examples
MT Tag handler
You can rely on Movable Type 5 to handle encoding its output.
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; }
You needed to encode by yourself at Movable Type 4.x.
return MT::I18N::encode_text( $data, 'utf-8' );
Receiving data from web services
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 ); }
Writing data to the external file without 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; }