キーワード

プロフィール

深沢千尋

Author:深沢千尋
みなさんこんにちは、深沢千尋です。(公式ページ
文字コード【超】研究 改訂第2版NEW!」「すぐわかるPerl」「すぐわかる オブジェクト指向 Perl」の著者です。
ここでは、多くは技術的でないこと、ごくまれに技術的なことをなげやりに書いていきます。
メールは suguwakaruPerl@gmail.com まで。(アットマークは ASCII に)
Twitterはじめました。@query1000です。よろしく~

最新記事

最新コメント

最新トラックバック

月別アーカイブ

カテゴリ

検索フォーム

RSSリンクの表示

リンク

ブロとも申請フォーム

QRコード

QRコード

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

「まるごとEncode」解題(3)use utf8;のスコープ

つづき。

#! perl
# utfNo.pl -- UTF8モードとバイトモードの切り替え

use strict;
use warnings;
binmode STDOUT, ':encoding(cp932)'; # 出力は cp932

{
use utf8; # このブロックの中ではUTF-8文字単位で解釈される
my $text = 'abc漢字ひらがなカタカナ';

#6文字目から4文字表示
print substr($text, 5, 4);
}
{
# このブロックの中では use utf8; と書かれていない---オクテット単位で解釈される
my $text = 'abc漢字ひらがなカタカナ';

#10バイト目から12バイト表示。decode を忘れない
print Encode::decode('utf8', substr($text, 9, 12));
}
__END__

実行結果は以下の通り。

C:\Documents and Settings\you\デスクトップ\Marugoto>utfNo.pl
ひらがなひらがな

今度のプログラムのキモは

{
...
}
{
...
}

である。

use utf8; の効果はカーリーブレース { } で囲まれたブロックスコープで作用するので、ブロックを脱出すると効果がなくなる。
これを使って、前半は use utf8; プログラム、後半はバイトストリームプログラムにしている。

なお、use は no で打ち消されるので、

#! perl
# utfNo.pl -- UTF8モードとバイトモードの切り替え

use strict;
use warnings;
binmode STDOUT, ':encoding(cp932)'; # 出力は cp932

use utf8; # これ以降UTF-8文字単位で解釈される
my $text = 'abc漢字ひらがなカタカナ';

#6文字目から4文字表示
print substr($text, 5, 4);

no utf8; # これ以降オクテット単位で解釈される
$text = 'abc漢字ひらがなカタカナ';

#10バイト目から12バイト表示
print Encode::decode('utf8', substr($text, 9, 12));

__END__

と書いても同じこと。

この場合同じブロックで同じ $text を2回 my すると怒られるので注意。
(別に同じ変数を2回使えばいいから変数定義じたいいらないんだけど)
スポンサーサイト

<< 「まるごとEncode」解題(4)use bytes; の迷宮 | ホーム | 「まるごとEncode」(2)use utf8の導入 >>


コメント

コメントの投稿


管理者にだけ表示を許可する

 ホーム 


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。