キッズプレート、パスタおかわり

プログラミングやデジモノについてあれこれ
--.--.-- --:--|カテゴリ:スポンサー広告| コメント(-)

スポンサーサイト


上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
2009.01.07 14:49|カテゴリ:Perlコメント(0)

Perlのソース内で文字をコード文字列で指定したい


 久しぶりのPerlネタ。今回も知ってる人にとってはどーでもよいネタですね。

 Perlのソース内で文字をコード値で指定したい場合があります。文字パレットに16進文字列で表示されているあれです。そう「A」なら「41」、「B」なら「42」です。とうぜんこの値は文字のエンコードに応じて変わってきます。ただ、今の時代「文字をコード値で指定したい」なんて要望の場合はUnicodeのコード値であることが多いです。さあさあここで問題です。
「Unicodeのコード値といえどもエンコードに応じて変わってしまうじゃないか」
 そうっすよね。Unicodeって言ったってエンコード方法にはUTF16もあればUTF8もあるしどっちを使えって言うのさ! というのが正直な感想です。そこでPerlにはこいつを本来のUnicodeの番号で指定する方法があります(ここらへんの話はけっこうややこしいのでWikipediaなんかを参考にしていただけるとよろしいやもしれません)。
 では具体的な例で見てみましょう。
 ひらがなの「あ」を題材にしてみます。
 ひらなのの「あ」はユニコードのIDでは12354番が割り当てられています。まあ一般的には16進であらわすので「あ」は12354を16進に変換して「3042」ということになります。さてこのユニコード値がエンコード方法に応じて変換され実際にファイルに書き込まれるバイナリーデータとなるわけです。
 この3042をUTF16に放り投げると3042になります。UTF8に放り投げるとE38182になります。例えばUTF8の場合、この値をファイルに保存しておいて後で開くときに、
「E38182てなんていう字だっけ?」
 ということでUTF8君に放り投げると3042が返ってきて、
「3042ってUnicodeの「あ」だよね?」
 ということで画面に「あ」が表示されるわけです。3042をE38182にするのがエンコード処理、E38182を3042にするのがデコード処理です。適切なバイナリデータと適切なエンコード、デコードの指示をすると正しい文字がいつでも表示できるというわけですね。めでたしめでたしって、かなり話がずれてしまいました。
 まあこうやってエンコードとデコードの処理を見るに、
「いろんなエンコード方式に共通する値であるUnicode値で指定できたらソースの中でエンコードの種類なんか気にせず文字を正確に指定できるじゃないか」
 というのが今回紹介する指定方法です。実際にPerlのソース内でUnicode値で文字を指定する方法はこれです。
\x{3042}
 いやー、たったこれだけを紹介するのにえらい時間がかかってしまった。。。上記の3042部分がUnicode値を指定する部分なのでここを変更すればUnicode値でいろんな文字を指定できます。まあこれが何の役にたつかと言えば自分でテキスト書き出しをする際です。ファイルの先頭にBOMを付けろと言われるとちょっと悩んじゃいますよね。一般的にぐぐってみればマックでビッグエンディアンのBOMを付けろなんてことになると「FEFF」だよーんと出てきます。じゃあそんな文字をUTF8の設定ファイルに前もって保存しておくなんてことになるとFEFFをUTF8でエンコードした結果をバイナリで書き込んで、ほにゃららほにゃらら、なんて面倒なことになってしまいます。そこでさっきのUnicode指定で変数に\x{FEFF}を放り込めばそんな悩みとはおさらばです。いやーありがたい機能ですねえ。
 最後にサンプルです。
#!/usr/bin/perl
use utf8; #-ソースがUTF8だという宣言
use Encode;
binmode STDOUT, ":utf8"; #-画面に出力したい文字コード
binmode STDERR, ":utf8"; #-エラー出力に使いたい文字コード
binmode STDIN, ":utf8"; #-標準入力から入ってくる文字コード
$a = "\xe3\x81\x82";#-16進指定ででUTF8のコード値を入れてみる
$b = "\x{3042}";#-ユニコード値で指定
print $a . decode(utf8,($a)) . $b . "\n";
exit;
 結果はこうなります。
===結果ここから===
ãああ
===結果ここまで===
 $a = "\xe3\x81\x82"のような指定をした場合はdecodeしないと文字化けしちゃいます。あー、なんかおもったより記事が長くなっちゃったなあ。
コメントの投稿












管理者にだけ表示を許可する
トラックバック
この記事のトラックバックURL

プロフィール

ひらくん Author:ひらくん
どもども、ひらんくんどす。
日々まったり過ごしております。
仕事はDTP関連のスプリクト&アプリケーション開発。
Follow happyscript on Twitter

ブログ内検索



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