Hatena::Groupperl

Perl Study Memory

There is a difference between knowing the path and walking the path.

自己紹介  | 初めてのPerl 第3版  | 続・初めてのPerl 改訂版  | アーカイブ  | 参考書籍・推薦図書

 | 

2010-04-01

続・no utf8;ができない

| 00:43 | はてなブックマーク - 続・no utf8;ができない - Perl Study Memory

こんばんは、AzureStone(あーじゅ・すとーん)です

昨日の続きです。朝、起きてこのブログを見てみると!なんとコメントが!!!ありがとうございます!!

でも恥ずかしいことにコメントを見てすぐに何を言っているのかが、よく理解できませんでした。

でも焦らず頂いたコメントの単語を調べていくと以下のことが理解できました。

  1. なぜ、no utf8;ができなかったのか?
  2. 何故、勘違いしたのか?
  3. 自分で問題解決できなかった理由
  4. UTF-8Unicodeは、一緒ではない
  5. 何故、UTF-8がよく使われているのか?
  6. utf8プラグマは、何のために存在するのか?
  7. utf8プラグマを使うこととUTF-8文字列を使うこととは違う

今回は、1,2,3だけに絞って説明して行きたいと思います。

前回、記せていませんでしたが、下記のようなコードと比較していました。

utf805.pl

#!/usr/bin/perl -l

use strict;
use warnings;
use utf8;

print length('あいうえお');

no utf8;
print length('あいうえお');

1;

上記のソースコードを実行すると下記のようになります。これは、私が期待していた結果です。

実行結果

azurestone@nsa01:~/tmp/perl/use_utf8$ ./utf805.pl 
5
15
azurestone@nsa01:~/tmp/perl/use_utf8$ 

次は、昨日の問題のコードです。

utf803.pl

#!/usr/bin/perl -l

use strict;
use warnings;
use utf8;

my $str = 'あいうえお';

print length($str);

no utf8;
print length($str);
1;

上記のコードを実行すると下記のようになります。昨日と全く一緒です。

実行結果

azurestone@nist01:~/tmp/perl/use_utf8$ ./utf803.pl 
5
5
azurestone@nist01:~/tmp/perl/use_utf8$ 

そこで私は、混乱しているなか情報を整理していきました。

そうすると頭に引っかかっていたことがわかりました。

それは、「なぜ変数に代入するとno utf8;が有効にならないのか?」でした。

これから示す三つのキーワードをしっかり理解出来ている方だと何故動かないかがわかると思います。

逆に今日まで僕は下記の三つを理解出来ていませんでした。

  1. use utf8;とno utf8;は具体的に何をするのか?
  2. 文字列リテラルとは?
  3. utf8 flagとは?

今日(03/31)まで文字列リテラルの定義を間違えていました。

  • そもそもリテラルとは、ソースコードに直接コーディングされたデータを指し、文字列リテラルとは、ソースコードに記された文字列(値)を指す。

つまり変数は、変数であって文字列リテラルではないということです。

そしてuse utf8;は、文字列リテラルASCII文字以外の文字にutf8 flagをつける。

そしてutf8 flagがついていれば、length()は、バイトコードではなくUnicodeのコードポイントとして扱う。

といったところでした。

最後にですが、自分で問題解決できなかったのは、昨日自分で参考していたWebサイトをよく読んでなかったからです。なんとなくutf8プラグマを有効すれば、バイトコードではなく文字列で扱ってくれるとしか思っていなかったからです。もっとしっかりドキュメントを読むべきだったのです。

utf8プラグマの話をすると長くなってしまうので今日は、省略します。調べていてわかったことは、もしかして私は通過儀礼を受けたのではないかと思いました。調べれば調べるほど情報がたくさんでてきます。しかも落ち着いて限定した情報だけをじっくり読めば、ものの5時間でPerlUnicodeを扱うにはどうすればよいかが理解できるということも身を持って体験した今日この頃です。orz.....


日付が代わり世間は、もっぱらエイプリルフールムードですが、教えて頂いた方に失礼になるので真面目に書いてみました。本当に教えてくれてありがとう!!(;^_^A アセアセ…


本日おすすめの関連書籍

初めてのPerl 第5版

初めてのPerl 第5版

 |