文字コードって本当に面倒だよね。
僕が実際仕事するときは何も考えなくていいように扱うファイル自体を UTF-8 に変換してから全ての作業が始まって、スクリプトが吐き出すのも全部 UTF-8 にしてる。
で、ファイル単位でユーザの環境に合わせて文字コードを適宜変換してから渡す・・・ということにしてる。
ただ、何らかの理由(ファイルが異常にでかいとか)でそうも行かないときは Perl の Encode モジュールを使う。
これがまたちょいちょい使い方を忘れてしまうのでメモしておきます。
#! /usr/bin/perl use warnings; use strict; # このファイルは UTF-8 で保存されてる use utf8; use Encode; # アウトプット open my $output, ">", "output_file"; # このスクリプトの引数に指定されたファイルは Shift_JIS # 一行読み込む際に内部文字列にデコードする # decode() の第一引数は対象ファイルの文字エンコードをセットする while(my $line = decode('Shift_JIS', <>)) { # -------------------- # $line をどうにかする # -------------------- # 出力先のファイルも Shift_JIS にするなら # encode() 関数の第一引数は Shift_JIS print $output encode('Shift_JIS', $line); # 標準出力の文字コードが UTF-8 # (つまりターミナル上は UTF-8 を使用している) # なら encode() 関数の第一引数は UTF-8 print encode('UTF-8', $line); } close $output;
ちなみにファイルの文字コードを調べるときは nkf コマンドが便利。
$ nkf --guess file Shift_JIS (LF)