miauのブログ

はてなダイアリー「miauの避難所」をはてなブログに移行しました

DBM の原因判明

ここで書いてた、

もともとの LANG は en_US.UTF-8 に設定されていて、ja_JP.UTF-8 の場合も同じく化けるけど、それ以外に設定されている場合は化けないらしい。

の件だけど、原因が判明したのでその話。


その後作業を続けてると、DBM に限らず「Apache だと期待どおりに動作するけど、ターミナルだと動作が変」というケースが結構あって。具体的には、勝手に UTF8 フラグがついたりつかなかったりしてるような気配。

その周りで色々調べてると、

Perl 5.8.0 の仕様変更により、
ロケールに en_US.UTF-8 を指定していたのなら, STDIN 及び STDOUT は
暗黙のうちに binmode(..., ":utf8") を行ったかのように自動的に "UTF-8"
になります」

http://fleur.hio.jp/perldoc/perl/5.8.1-RC4/perldelta.ja.html

ということでした、これは Perl 5.8.1 からこの機能は撤回されました。
(つまり、Perl 5.8.1 以降は起こらない)

なんて情報に行きあたって。

バージョンを調べてみると・・・

$ perl --version

This is perl, v5.8.0 built for i386-linux-thread-multi
:

きっちり 5.8.0 でした。今回はサーバのリプレースって聞いてるけど、なんでバージョン下がってるの?(元のサーバは 5.8.3 っぽい。)

この問題について、詳しくは、

を見ていただくとして。「5.8.0 は Unicode まわりの処理に問題があるから使わないほうがいい」みたいなことがよく言われますけど、こんな挙動もあるとは知りませんでした。