FANDOM


記述の前提 編集

  • Perl-5.10以降を前提とします。
  • 以下の記述では、Windows上で、ソースコードをcp932(Shift_JIS)で保存しているものとします。
  • \ (16進表記:5c) は半角の¥です。

単純に表示する例 編集

  • 次のスクリプト(say.pl)で説明します。
use 5.10.0;
say "日本語表示能力";
  • これを perl で実行すると次のように文字化けします。
Say 01.jpg
  • 文字化けする理由は、ソースのエンコーディングが cp932 であることを perl が知らないからです。
  • しかし、jperl で実行すると次のように正しく表示されます。
Say 02.jpg
  • 文字化けしない理由は、-MOneEncoding=cp932 スイッチによって、use encoding 'cp932' が挿入され、ソースコードのエンコーディングが cp932 で解釈されたからです。

ダイアモンド演算子 編集

  • 次のスクリプト(diamond.pl)で説明します。
while ( <> )
{
    print;
}
  • これを jperl で実行すると標準入力からの入力待ち状態になります。
  • そこへ「日本語表示能力」と入力すると、入力した行が print 文で表示されます。
  • Ctrl+Z で入力を終了します。
Diamond 01.jpg
  • ただし、この例では、perlで実行しても同じ結果になります。
  • この場合、たまたま結果は同じですが、入出力データに対する処理過程は違っています。
  • その違いは、次の例(diamond_with_regex.pl)で同様にテストすると分かります。
while ( <> )
{
    print if /表示/;
}
  • perlで実行した場合、意図どおりに正規表現がマッチしないのは、/表示/ のエンコーディングがcp932であることをperlに伝えていないからです。
  • 入出力データのエンコーディングもcp932で、ソースコードと同じですが、perlで実行した場合、― 以下、括弧内16進表記です ― 、/表示/ (955c 8ea6) は \ (5c) を含むため、それがエスケープ文字として解釈され、パタンマッチのための文字列には (5c) がなくなり、入力データ (955c 8ea6) と正規表現 (95 8ea6) はマッチしません。
  • jperlで実行した場合は、ソースコードも入力データもcp932からデコードされ、内部Unicodeになっているので、「表」は1つの文字コードとして解釈され、エスケープ文字に起因する誤解は生じません。
  • printでは、内部Unicodeからcp932へエンコードされ、正しく表示されます。

広告ブロッカーが検出されました。


広告収入で運営されている無料サイトWikiaでは、このたび広告ブロッカーをご利用の方向けの変更が加わりました。

広告ブロッカーが改変されている場合、Wikiaにアクセスしていただくことができなくなっています。カスタム広告ブロッカーを解除してご利用ください。

FANDOMでも見てみる

おまかせWiki