2007年05月10日 19:00 [Edit]

perl - use utf8;

camel

添削というより、ちょうどutf8 pragmaを説明するのにいい例題なので。

はこべにっき# - Web::Scraper便利!
my $left = decode_utf8('『'); 
my $right = decode_utf8('』'); 

スクリプトがUTF-8で書かれている場合は、わざわざdecode_utf8('リテラル');とするより、最初にuse utf8;としておくのが吉。

この点を明らかにするために、以下のcode snippetを示す。

#!/usr/local/bin/perl
use strict;
use warnings;
use Encode ();
use Devel::Peek;
{
    use utf8;
    my $name = '小飼弾';
    warn Encode::is_utf8($name)+0;
    Dump $name; 
}
{
    use bytes;
    my $name = '小飼弾';
    warn Encode::is_utf8($name)+0;
    Dump $name; 
}
1 at dankogai.pl line 9.
SV = PV(0x1802060) at 0x1820ce8
  REFCNT = 1
  FLAGS = (PADBUSY,PADMY,POK,pPOK,UTF8)
  PV = 0x6018e0 "\345\260\217\351\243\274\345\274\276"\0 [UTF8 "\x{5c0f}\x{98fc}\x{5f3e}"]
  CUR = 9
  LEN = 12
0 at dankogai.pl line 15.
SV = PV(0x18020c0) at 0x1821b38
  REFCNT = 1
  FLAGS = (PADBUSY,PADMY,POK,pPOK)
  PV = 0x613630 "\345\260\217\351\243\274\345\274\276"\0
  CUR = 9
  LEN = 12

見ての通り、utf8 pragmaはlexical scopeなので、局所的に扱いを変える事もできる。よってソースコードがUTF-8で書かれていたら、use strict;use warnings;のすぐ下でuse utf8;と宣言しておくとよいだろう。

ちなみに、utf8 pragmaの配下では、リテラルだけではなくシンボル名にもUnicodeを使うことが出来る。

#!/usr/local/bin/perl
use strict;
use warnings;
use utf8;

{
    package 人;
    sub 新{
        my $パッケージ = shift;
        bless {}, $パッケージ;
    }
    sub 姓{
        my $あたし = shift;
        $あたし->{姓} = shift if @_;
        $あたし->{姓}
    }

    sub 名{
        my $俺 = shift;
        $俺->{名} = shift if @_;
        $俺->{名};
    }
    sub 姓名{
        my $僕 = shift;
        $僕->{姓} . $僕->{名};
    }
}

my $人 = 人->新();
$人->姓('小飼');
$人->名('弾');
binmode STDOUT, ':utf8';
print $人->姓名, "\n";

Enjoy!

Dan the Just Another PerlUnicode Hacker


この記事へのトラックバックURL

この記事へのトラックバック
 PerlでのUTF8の扱いについて宣伝するのなら、それでファイル名を扱えないことについてちゃんとフォローしておいてくださいね。
[Perl][filename] それよりマルチバイトなファイル名についてなんとかしてくださいよ。【浅倉卓司@blog風味?】at 2007年05月11日 11:44
はこべにっき# - Web::Scraper便利!が、添削というか良い例題になってようです。 スクリプトがUTF-8で書かれている場合は、わざわざdecode_utf8(’リテラル’);とするより、最初にuse utf8;としておくのが吉。 〜〜 見ての通り、utf8 pragmaはlexical scopeなので、局所的に...
[Perl]use utf8;【はこべにっき#】at 2007年05月11日 01:03
404 Blog Not Found:perl - use utf8;ちなみに、utf8 pragmaの配下では、リテラルだけではなくシンボル名にもUnicodeを使うことが出来る。 (コード略) Enjoy! Dan the Just Another PerlUnicode Hacker ぼくだったらこう書きます><#!/usr/bin/perl use strict; use warning...
Re: perl - use utf8;【YappoLogs】at 2007年05月10日 20:56
404 Blog Not Found:perl - use utf8;ちなみに、utf8 pragmaの配下では、リテラルだけではなくシンボル名にもUnicodeを使うことが出来る。 (コード略) Enjoy! Dan the Just Another PerlUnicode Hacker ぼくだったらこう書きます><#!/usr/bin/perl use strict; use warning...
Re: perl - use utf8;【YappoLogs】at 2007年05月10日 20:55