gcg00467

perlにおける日本語の扱い

最終更新:

gcg00467

- view
管理者のみ編集可

perl ソースの中に,日本語文字を指定したい場合, 次のように指定するのが便利:

 use open IN => ":encoding(shiftjis)", OUT => ":encoding(euc-jp)";
 use encoding "shiftjis", STDIN => "euc-jp", STDOUT => "utf8";

重要: use open を use encoding より前に記述すること.

  • use open では,次の表現を用いる.
    • ":encoding(shiftjis)"
    • ":encoding(euc-jp)"
    • ":encoding(iso-2022-jp)"
    • ":encoding(utf8)"
  • use encoding では,次の表現を用いる.
    • "shiftjis"
    • "euc-jp"
    • "iso-2022-jp"
    • "utf8"
  • use open で,IN と OUT に同じものを指定するときには,
       use open ":encoding(shiftjis)";

などと書ける.

  • use encoding で,3つとも同じものを指定するときには,
       use encoding "shiftjis";

などと書ける.

  • perl の文字列の内部表現は,UTF-8 を元にしていて,それをちょっと変えた ものになっているらしい.その詳細は知らなくても良いようになっている.
  • 文字列リテラルに日本語を使いたい場合などで, ソースファイルをUTF-8以外で記述する場合には,
       use encoding "shiftjis"

など ("shiftjis" または "euc-jp" または "iso-2022-jp") を使う. こうすると,

  1. 指定した文字列は,自動的に perl の文字列内部表現になる. したがって,例えば
       s/動力性能/foo/

のようなものが安全に動作する.(注: shifjisの「能」の2バイト目は バックスラッシュと同じ)

  1. STDIN と STDOUT は,自動的に shiftjis とみなされる.(読んだ後は perl の内部表現になる). 注: STDERR は対象外.

これで,STDIN と STDOUT は,カバーされる.その他のファイル入出力 も同様に処理したい場合には,

       use open ":encoding(shiftjis)";

が便利.

重要: これは,「use encoding "shiftjis";」よりも前に記述すること.

これによって,入出力とも,open したものは,shiftjis の読み書きが 仮定される.すなわち,入力については,shiftjisで書かれてあるという前提 のもと,読んだ後は perl の内部表現になる.出力は,perl の内部表現 から shiftjis への変換が行われる.

出力は別のコーディングにしたいと言うときには,

       use open IN => ":encoding(shiftjis)", OUT => ":encoding(euc-jp)";

のようにすることもできる.もっと一般には,

       open(FD1, "foo.txt");
       binmode(FD1, ":encoding(shiftjis)");
       open(FD2, ">bar.txt");
       binmode(FD2, ":encoding(euc-jp)");

のようにする.なお,UTF-8 は,":encoding(utf8)" ではなく,":utf8" である. この場合,use open はいらない.

STDINとSTDOUT は,「use open」では制御できず,「use encoding」を使わなくては ならない.独立にエンコーディングを指定するには

       use encoding "shiftjis", STDIN => "euc-jp", STDOUT => "utf8";

のようにする.なお,

       use encoding "..."

が無い場合には,

       binmode(STDIN, ":encoding(shiftjis)");
       binmode(STDOUT, ":encoding(euc-jp)");

なども動作するようである.

目安箱バナー