結城浩のはてなブログ

ふと思いついたことをパタパタと書いてます。

UTF-8なファイル名(Windows XPの場合)

弾さんのperl - utf8なファイル名を見て、Windows XPではどうかなと思ってやってみました。
まず、最初のディレクトリの様子を示します。

C:\work\utf8> dir
2007/05/11  14:03    <DIR>          .
2007/05/11  14:03    <DIR>          ..
2007/05/11  13:49               321 make_utf8_fs.pl
2007/05/11  14:02               462 use_utf8_fs.pl

そして、make_utf8_fs.plを動かし、もう一度ディレクトリを見ます。

C:\work\utf8> perl make_utf8_fs.pl
C:\work\utf8> dir
2007/05/11  14:03    <DIR>          .
2007/05/11  14:03    <DIR>          ..
2007/05/11  13:49               321 make_utf8_fs.pl
2007/05/11  14:02               462 use_utf8_fs.pl
2007/05/11  14:03    <DIR>          邨仙沁

「邨仙沁」という変なディレクトリができていますが、これは「結城」をutf8のバイト列で書いたのを、Windowsファイルシステムで見るとこうなったのだと思います。
次にuse_utf8_fs.plを動かすと、$結城::浩::ふりがなの値が表示されています。ついでにutf8で書かれたスクリプト(make_utf8_fs.pl, use_utf8_fs.pl, 結城/浩.pm)の内容もShift_JISとして表示します。

C:\work\utf8> perl use_utf8_fs.pl
ゆうきひろし
-- make_utf8_fs.pl --
#!/usr/bin/perl
# This script is written in utf8.
use strict;
use warnings;
use utf8;
mkdir '結城';
open my $fh, '>:utf8', '結城/浩.pm' or die $!;
print $fh <DATA>;
close $fh;
__END__
use strict;
use warnings;
use utf8;
{
    package 結城::浩;
    our $ふりがな = 'ゆうきひろし';
}
1;
-- use_utf8_fs.pl --
#!/usr/local/bin/perl
# This script is written in utf8.
use strict;
use warnings;
use utf8;
use 結城::浩;

binmode STDOUT => ':encoding(Shift_JIS)';

print $結城::浩::ふりがな, "\n";

print_file('make_utf8_fs.pl');
print_file('use_utf8_fs.pl');
print_file('結城/浩.pm');

sub print_file {
    my ($filename) = @_;
    print "-- $filename --\n";
    open my $fh, '<:utf8', $filename or die $!;
    print <$fh>;
    close $fh;
}
-- 結城/浩.pm --
use strict;
use warnings;
use utf8;
{
    package 結城::浩;
    our $ふりがな = 'ゆうきひろし';
}
1;

メモ(はしょった説明)

  • Perlスクリプト自身をutf8で書くときには use utf8; をしておく。
  • オープンするファイルがutf8のときには、open my $fh, '>:utf8', $filename とか、open my $fh, '
  • 標準出力をShift_JISにするときには binmode STDOUT => ':encoding(Shift_JIS)'; とする。
    • binmode STDOUT => ':Shift_JIS'; はだめ。詳しくはperldoc -f binmode参照。
    • 疑問:弾さんのスクリプトで binmode STDOUT => ':utf8'; となっていましたが、binmode STDOUT, ':utf8'; とどちらがよいスタイルなんでしょうね。

参考(あとで読む)

追記:
ブログのタイトルなどはutf8ではなくutf-8と書いて欲しいところというコメントが。なるほど!直してみました。でもそれをいうなら、utf-8でもなくUTF-8ではと思ったのですが、いかがでしょう。RFC 3629 - UTF-8, a transformation format of ISO 10646