キーワード

プロフィール

深沢千尋

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

最新記事

最新コメント

最新トラックバック

月別アーカイブ

カテゴリ

検索フォーム

RSSリンクの表示

リンク

ブロとも申請フォーム

QRコード

QRコード

スポンサーサイト

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

「まるごとEncode」(2)use utf8の導入

つづき。

#! perl
# newPerl.pl -- 日本語の文字を1文字として解釈
use strict;
use warnings;
use utf8; # スクリプトは UTF-8 で保存

binmode STDOUT, ':encoding(cp932)'; # 出力はCP932に変更
# これがないと出力は UTF-8(縺イ繧峨′縺ェ)になるばかりか、
# Wide character in print といわれる。
# UTF-8 フラグがたっているからである。

my $text = 'abc漢字ひらがなカタカナ'; # 6文字目から4文字「ひらがな」と表示
print substr($text, 5, 4);

__END__

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

print substr($text, 5, 4);

である。

前回の

print decode('utf8', substr($text, 9, 12));

とは違い、

my $text = 'abc漢字ひらがなカタカナ'; # 6文字目から4文字「ひらがな」と表示

という文字をオクテット単位ではなくて、文字種に関係なく、文字単位で数えている。
(オクテット(octet)とは8ビットのことで、いわゆるバイトのこと。byte はコンピューターで扱う情報の最小単位のことで、オクテットの方が正確)

さて、

binmode STDOUT, ':encoding(cp932)'; # 出力はCP932に変更

を指定しているのに、今回は print に渡す substr 関数の結果値を decode していない。
これは、$text が Perl 内部表現文字列だからである。

なぜかというと、

use utf8; # スクリプトは UTF-8 で保存

しているからだ。

これは、このプログラムを utf8 で書きますよという宣言だが、これによって文字列は Perl 内部表現になり、文字は文字単位で数えられる。
「abc」も「日本語」も3文字である。

ちなみに、

binmode STDOUT, ':encoding(cp932)'; # 出力はCP932に変更

を外して実行してみると、

C:\Documents and Settings\you\デスクトップ\Marugoto>newPerl.pl
Wide character in print at C:\Documents and Settings\you\デスクトップ\Marugoto\newPerl.pl line 13.
縺イ繧峨′縺ェ

となる。

この「Wide character in print」というのは、ワイド文字が print されましたよ、ということだ。
ここでいうワイド文字というのは、encode していない文字のことだ。
つまり、Perl 内部表現文字をそのまま print してしまったときに発生するエラーである。
STDOUT を binmode してから print すると encode が行われ、正常にバイトストリーム化されるので、このエラーは出なくなる。

こころみに

binmode STDOUT, ':encoding(uff8)';

としてみるとよくわかる。

C:\Documents and Settings\you\デスクトップ\Marugoto>newPerl.pl
縺イ繧峨′縺ェ

難しい字はそのままだが、Wide character in print が消えた。

C:\Documents and Settings\you\デスクトップ\Marugoto>newPerl.pl > k.txt

とファイルにリダイレクトして中を見てみると、正しく UTF-8 の「ひらがな」になっている。
スポンサーサイト

<< 「まるごとEncode」解題(3)use utf8;のスコープ | ホーム | 「まるごとEncode」解題(1)Encode以前のPerl(を説明するプログラムのはずが・・・) >>


コメント

コメントの投稿


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

 ホーム 


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