作者: KIMURA Koichi
日時: 2006/5/06(23:22)
Bruce.です。

一日遅れですが、藤岡さんの更新日記から。

> 謎、その一。上記の「open OUT, ">:utf8", "out.txt";」の行を
> 次の2行に変えると、なぜかONにはならない。
>
> binmode OUT, ":utf8";
> open OUT, ">out.txt";

use warnigns していれば謎はすぐに解けます。

binmodeの引数にくるのはファイルハンドルですから、
オープンしていない状態の bareword を渡しても意味がありません。

binmode FILEHANDLE, LAYER

binmode FILEHANDLE

Arranges for FILEHANDLE to be read or written in "binary" or "text" mode
on systems where the run-time libraries distinguish between binary and
text files. If FILEHANDLE is an expression, the value is taken as the
name of the filehandle. Returns true on success, otherwise it returns
undef and sets $! (errno).

use warnigns していれば以下のようなメッセージが出るはずです。
(コマンドラインオプション -w でも可)

binmode() on unopened filehandle OUT at utf-8flag.pl line 11.

> 謎、その二。UTF-8フラグをONにした場合とOFFにした場合で
> テキスト処理の仕方がどう違ってくるのかというのが、
> 次の問題になるだろう。UTF- 8フラグがOFFの場合でも、
> 上記のスクリプトの場合、正規表現はバイトデータの
> UTF-8文字列で正常にマッチが起こったように見える。[

UTF-8フラグがつくとどうなるかというと、「バイト指向」が
「文字指向」になります。つまり、マルチバイト文字の
各バイトが泣き分かれになることなく、一文字を構成する
ものとしてひとまとまりに扱われるということです。

このことは、たとえば文字列にlength()を適用した結果を
use utf8 したときと、use bytes したときでどう変わるかを
見ればわかります(このプラグマはレキシカルスコープを持つので
ブロックやサブルーチン単位でon/offすることができます)。

正規表現で確かめたいのなら、量指定子をマルチバイト文字
に対して付加してみてどのようなバイト列にマッチするかを
見ればよろしいかと。

> 注意]上記のスクリプトはUTF-8に変換して保存してテストしなければ
> 意味がない。最近のPerl(v5.8.7以降かな?)はUTF-8テキストにBOMが
> 付いていても読めるようになった。

perlunicode をみると、5.8.4→5.8.5で以下のようなエントリが
追加されています。多分、この辺で対応されたのではないでしょうか。
#perldeltaには記載なし

BOM-marked scripts and UTF-16 scripts autodetected
    If a Perl script begins marked with the Unicode BOM (UTF-16LE,
UTF16-BE, or UTF-8), or if the script looks like non-BOM-marked UTF-16
of either endianness, Perl will correctly read in the script as Unicode.
(BOMless UTF-8 cannot be effectively recognized or differentiated from
ISO 8859-1 or other eight-bit encodings.)


-- 
木村浩一
  I thought what I'd do was, I'd pretend I was one of those deaf-mutes.
  mail kbk at kt.rim.or.jp
	web  www.kt.rim.or.jp/~kbk/index.html#zakkicho
	     homepage3.nifty.com/farstar/