utf8

最近のPerlではソースコードをUTF-8で記述する事が多いと思いますが、その際の定番プラグマがutf8です。ソースコードの先頭で「use utf8;」と記述するとPerlはソースコードがUTF-8エンコードされている事を認識します(当たり前ですが、UTF-8エンコードでないソースコードに書いてはいけません)。

ちなみにソースコードにBOMを付けてもちゃんとPerlはUTF-8と認識してくれます。しかし、テキストエディタで開いた時に分かりにくいので、BOMに頼るより「use utf8;」と書いた方が確実ですね。

PerlがソースコードをUTF-8と認識する事で以下の効果が得られます。

  1. 文字列リテラルがASCII範囲外なら自動的にutf8フラグが付く。
  2. 変数や関数の名前に、多バイト文字が使える様になる。
  3. 正規表現の条件に多バイト文字が使える様になる。

文字列リテラルへのutf8フラグ付与の例

文字列リテラルにutf8フラグが付く例です。

utf8.pl

#!/usr/bin/perl

use utf8;

my $string1 = "This is string";
my $string2 = "これは文字列";

print utf8::is_utf8($string1);
print "\n";

print utf8::is_utf8($string2);
print "\n";

実行すると、下記の通りの表示になります。

$perl utf8.pl

1

ASCIIコードの範囲内なら、フラグ無し。ASCIIコードの範囲を超えるなら、フラグ有り、という結果になっています(フラグが無いと何も表示されないので、ちょっと結果が分かりづらいですが)。

変数名に多バイト文字を使った例

実際にあまり使う事は無い様な気がしますが、変数名や関数名に多バイト文字が使える様になります。

$ more variable.pl 
#!/usr/bin/perl

my $変数 = "utf8 variable";

print $変数;

$ perl variable.pl 
Can't use global $^????????????? in "my" at variable.pl line 3, near "my $?"
Unrecognized character \xA4 in column 6 at variable.pl line 3.

「use utf8;」が無いと、エラーになっちゃいました。次に「use utf8;」を付け加えます。

$ more variable.pl 
#!/usr/bin/perl

use utf8;
my $変数 = "utf8 variable";

print $変数;

$ perl variable.pl 
utf8 variable

無事に実行できました。

正規表現の検索条件に多バイト文字を使う

正規表現の検索条件を記述する際に、多バイト文字を使っても正しく動作します。

$ more pattern.pl 
#!/usr/bin/perl

my $string = "検索対象の文字列です。";

if ($string =~ /文.列/) {
        print "Match!";
} else {
        print "Not Match!";
}
$ perl pattern.pl 
Not Match!

「文」と「列」の間には「字」の1文字しか無いはずですが、バイト数で数えてしまっているのでピリオドがマッチしていません。「use utf8;」を先頭に加えます。

$ more pattern.pl 
#!/usr/bin/perl

use utf8;
my $string = "検索対象の文字列です。";

if ($string =~ /文.列/) {
        print "Match!";
} else {
        print "Not Match!";
}
$ perl pattern.pl 
Match!

次はちゃんとマッチしました。

少しまぎらわしいのですが、Perlには「utf8::」の名称で始まるutf8フラグに関する関数群が用意されています。しかし、これは「use utf8;」の記述無しに使う事が出来ます。ただし、同じ機能がEncodeモジュールでも提供されているので、ここでは解説しません。


→Perl To The Peopleのインデックスページへ戻る

トラックバックURL

このエントリーのトラックバックURL:
http://ash.roova.jp/mt/mt-tb.cgi/128

コメントする