• atwiki
  • gcg00467
  • perlにおける日本語の扱いの編集履歴ソース
「perlにおける日本語の扱い」の編集履歴(バックアップ)一覧に戻る

perlにおける日本語の扱い - (2008/01/06 (日) 13:11:09) のソース

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") を使う.
こうすると,

+ 指定した文字列は,自動的に perl の文字列内部表現になる.
したがって,例えば

        s/動力性能/foo/

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

+ 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)");

なども動作するようである.
目安箱バナー