Home

memo-space

Perlのutf8フラグとDBI::Pg - その2

Perlのutf8フラグとDBI::Pgの続き。

DBD::Pg で取得した文字列に自動的に utf8 フラグを付けるには、$dbh->{pg_enable_utf8} を 1 にする。 ただ、これは本当に utf8 フラグを付けるということしかしないようなので、client_encoding を utf8 にするのは自分でやらなきゃいけないようだ。 client_encoding と連動してくれても良さそうな気もする。

データベースが euc-jp、ソースコードが utf-8 の例はこんな感じ。

#!/usr/bin/perl
use Encode;
use DBI;
use Data::Dumper;

my $dbh = DBI->connect("dbi:Pg:options='-c client_encoding=utf8'", "", "");
my $q = "select 'あいうえお'::text";

$dbh->{pg_enable_utf8} = 1;
my $s = $dbh->selectall_arrayref($q)->[0][0];
print utf8::is_utf8($s) ? "utf8": "not utf8", "\n";
print Encode::encode_utf8($s), "\n";

ところで、この pg_enable_utf8 は、取得した値のデータ型見て、text 型や varchar 型などの文字列型であれば utf8 フラグを付ける。その為以下のコードだと utf8 フラグは付かない。

my $q = "select 'あいうえお'";

何故かというと、明示的な型指定がない文字列リテラルは、PostgreSQL では unknown 型だからだ。

はっきりいって子供の頃から夢(寝てる時に見るヤツじゃない方)みたいなもんは無かったし、文集かなんかに「将来の夢」とか書かされるのが非常にうっとおしかった。「野球選手」とか書いておけば子供らしいだろうか、とか考える冷めた小学生だった(ちなみに運動部の経験無し)。

んでまあ、0x20歳になって突然、やりたいことを思いついた。なんでもっと早く気が付かなかったんだろう。子供の頃からすぐ側にあったはずの夢だった。ここ数日ぼんやりと考えていたことが、ああこれが夢なのかと気がついた。

もしかしたら来週にはどうでもいいことになっているかもしれないけど。

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
が↑がががΜが━が

DBD::Pgについて

あとで書く

ネタ仕込み中

とりあえず今のうちにいっときますが100%ネタですから(何?

流星ワゴン

何年か周期で小説を読める時と読めない時がやってくる。 ひょっとして今は読めるときなのではと数冊文庫本を買ってきた。

ずいぶん前に NHK で「ビタミンF」という短編ドラマを見て、 しばらく後にその原作が重松清だということを知った。 ちなみにそのドラマを見た時の(2002年)感想が関心空間に残ってました。

で、初めて重松清の小説を読んだわけです。

序盤は、死、後悔、絶望、裏切りと暗くて重い展開で読むのを挫折しそうになったけど、面白かったです。うん。ウマい。珍しく小説を読んで元気が出た。 やっぱ「ビタミンF」を見た時と雰囲気似てるな。

かぶりを振るという表現を初めて知った。

Home

Search
Feeds
Profile
石田@苫小牧市と名乗りつつ札幌の某社に勤務するプログラマ
書いた本
Links

Page Top