gcg00467
perlにおける日本語の扱い
最終更新:
gcg00467
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)");
なども動作するようである.