Home > perl > Perlのutf8フラグとDBI::Pg

Perlのutf8フラグとDBI::Pg

Perl5.8 から、文字列を内部で Unicode で扱えるようになった。

  • utf8 フラグ無し -> バイナリ列
  • utf8 フラグ付き -> 文字列の内部形式

みたいな感じだと思う。 utf8 フラグを付ける(内部形式にする)ことを decode、その逆を encode と言う。 なので、Perl でマルチバイトを扱うときは、

  • 外部からのマルチバイト文字列の入力を decode する。(utf8 フラグを付ける)。
  • で、いろいろ文字列を処理。
  • 出力するときは encode してから出力。

utf8 フラグ付きのマルチバイト文字列をそのまま出力しようとすると警告がでる。

コードはこんな感じ。ソースは euc-jp で書いてます。

#!/usr/bin/perl
use strict;
use Encode;
# $s1 は utf8 フラグ無し、$s2 は utf8 フラグ付き
my $s1 = "あいうえお";
my $s2 = Encode::decode("euc-jp", "あいうえお");

print $s1, "\n";
print $s2, "\n";    # そのまま出力すると警告

print "s1 len = ", length($s1), "\n";
print "s2 len = ", length($s2), "\n";

$s1 =~ s/./$&,/g;
$s2 =~ s/./$&,/g;   # 正規表現も使えます

print $s1, "\n";
print Encode::encode("euc-jp", $s2), "\n";

実行結果

あいうえお
Wide character in print at pg.pl line 9.


s1 len = 10
s2 len = 5
が↑がががΜが━が

Writeback:0

Comment Form

writeback message: Ready to post a comment.

TrackBack ping me at
http://www.mono-space.net/blog/perl/e060722_utf8.trackback

Page Top