MovableType 5 から、内部の文字コードが utf-8 になり、外部とデータの入出力を行う場合には、文字化けに注意する必要があります。これは MovableType に限ったことではないですが、Perl で文字を扱う場合の utf-8 の扱いについて少し実験してみました。そのまとめ。
結果
use utf8 なし
|
あ | x{3042} | xe3x81x82 |
print |
あ | あ (Wide character in print 警告) | あ |
Dumper |
あ | x{3042} | あ |
length |
3 | 1 | 3 |
Encode::is_utf8 |
false | true | false |
Encode::encode |
(文字化け) | あ | (文字化け) |
Encode::decode |
あ (Wide character in print 警告) | (Cannot decode string with wide characters エラー) | あ (Wide character in print 警告) |
use utf8 あり
|
あ | x{3042} | xe3x81x82 |
print |
あ (Wide character in print 警告) | あ (Wide character in print 警告) | あ |
Dumper |
x{3042} | x{3042} | あ |
length |
1 | 1 | 3 |
Encode::is_utf8 |
true | true | false |
Encode::encode |
あ | あ | (文字化け) |
Encode::decode |
(Cannot decode string with wide characters エラー) | (Cannot decode string with wide characters エラー) | あ (Wide character in print 警告) |
その他
- 結合する文字の中に utf8 フラグの立ったものが一つでもある場合、結合された文字列も utf8 フラグが立つ
- utf8 フラグの立った文字を print すると、一見正しく表示できるが、警告メッセージが出る
- utf8 フラグの立った文字を Encode::decode するとエラーになる(decode し過ぎ)
- utf8 フラグの立っていない文字を Encode::encode すると文字化けする(encode し過ぎ)
ソースコード
#!/usr/bin/perl
#use utf8;
use Encode;
use Data::Dumper;
my $VAR1 = "あ";
my $VAR2 = "x{3042}";
my $VAR3 = "xe3x81x82";
print '$VAR1 = ', $VAR1, "
";
print '$VAR2 = ', $VAR2, "
";
print '$VAR3 = ', $VAR3, "
";
print '-' x 32, "
";
print Dumper ($VAR1, $VAR2, $VAR3);
print '-' x 32, "
";
print 'length $VAR1 = ', length $VAR1, "
";
print 'length $VAR2 = ', length $VAR2, "
";
print 'length $VAR3 = ', length $VAR3, "
";
print '-' x 32, "
";
print 'Encode::is_utf8 ($VAR1) = ', Encode::is_utf8 ($VAR1) ? 'true' : 'false', "
";
print 'Encode::is_utf8 ($VAR2) = ', Encode::is_utf8 ($VAR2) ? 'true' : 'false', "
";
print 'Encode::is_utf8 ($VAR3) = ', Encode::is_utf8 ($VAR3) ? 'true' : 'false', "
";
print '-' x 32, "
";
print 'Encode::encode ("utf-8", $VAR1) =', Encode::encode ('utf-8', $VAR1), "
";
print 'Encode::encode ("utf-8", $VAR2) =', Encode::encode ('utf-8', $VAR2), "
";
print 'Encode::encode ("utf-8", $VAR3) =', Encode::encode ('utf-8', $VAR3), "
";
print '-' x 32, "
";
print 'Encode::decode ("utf-8", $VAR1) =', Encode::decode ('utf-8', $VAR1), "
";
print 'Encode::decode ("utf-8", $VAR2) =', Encode::decode ('utf-8', $VAR2), "
";
print 'Encode::decode ("utf-8", $VAR3) =', Encode::decode ('utf-8', $VAR3), "
";
print '-' x 32, "
";
print 'Encode::is_utf8 ($VAR1. $VAR2) = ', Encode::is_utf8 ($VAR1. $VAR2) ? 'true' : 'false', "
";
print 'Encode::is_utf8 ($VAR2. $VAR3) = ', Encode::is_utf8 ($VAR2. $VAR3) ? 'true' : 'false', "
";
print 'Encode::is_utf8 ($VAR3. $VAR1) = ', Encode::is_utf8 ($VAR3. $VAR1) ? 'true' : 'false', "
";