[Perl] use utf8 の有無による文字の扱い

Posted by
ぴろり
Posted at
2010/11/06 12:53
Trackbacks
関連記事 (0)
Post Comment
コメントできます
Category
開発メモ カテゴリ

 MovableType 5 から、内部の文字コードが utf-8 になり、外部とデータの入出力を行う場合には、文字化けに注意する必要があります。これは MovableType に限ったことではないですが、Perl で文字を扱う場合の utf-8 の扱いについて少し実験してみました。そのまとめ。

このエントリーをはてなブックマークに追加  

結果

use utf8 なし

x{3042}xe3x81x82
print あ (Wide character in print 警告)
Dumper x{3042}
length 313
Encode::is_utf8 falsetruefalse
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 113
Encode::is_utf8 truetruefalse
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', "
";
このエントリーをはてなブックマークに追加  


この記事のアーカイブ

全ての記事 »
2010年
全てのカテゴリ »
電算室 » 開発メモ
全てのタグ »
, , ,

関連記事/トラックバック

関連記事/トラックバックはまだありません

この記事にトラックバックを送るには?

コメントを投稿する

 
 (必須, 匿名可, 公開, トリップが使えます)
 (必須, 匿名可, 非公開, Gravatar に対応しています)
 (必須)
スパム コメント防止のため「投稿確認」欄に ランダムな数字 CAPTCHAについて を入力してから送信してください。お手数ですがご協力のほど宜しくお願いいたします。